|
I'm working on a WPF app that hits SQL on a network. Next year I will be adding in a tablet app which will include adding in a WebAPI and hosting the BL & DAL on a server, probably in IIS.
In each table I have the following columns
CreatedById INT NOT NULL FOREIGN KEY REFERENCES Users(UserId),
CreatedDT DATETIME NOT NULL,
LastModifiedById INT NULL FOREIGN KEY REFERENCES Users(UserId),
LastModifiedDT DATETIME NULL,
DeletedById INT NULL FOREIGN KEY REFERENCES Users(UserId),
DeletedDT DATETIME NULL
The question is this.... How would I pass the PK of the logged in user to the back end? Right now, with the WPF app, once the user logs in, I know their PK but I don't do anything with it.
My app has VM's which call the BL, which calls the DAL. Would you pass the User's PK to each method??
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
While that is common to do, it would be more appropriate to have that in a separate table and link to it from the tables that require the fields.
Kevin Marois wrote: How would I pass the PK of the logged in user to the back end? From where? A sproc, inline SQL? The UI should know the username, so fetching the key and getting/using the pk in the backend should be straightforward.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Yes, but pass what from the UI? Being stateless t seems like I'd have to pass that along with every call
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
You DAL should have a "common point" for adding user ids, etc. to anything it passes along. The foreign key references are an unnecessary overhead for basic "audit" data that never changes.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
Based on your response, as well as Eddy's, I'm going to assume that my question wasn't clear. So let me clarify.
I need to write out the ID of the logged in user to records that are added, marked as deleted, or modified. There are probably over 50 methods in the DAL. The Create and Update methods take an entity, and the Delete methods take an int Id of the record to mark as deleted.
So, in the UI, the user clicks Add, fills out the data, then clicks Save. or makes changes to an existing record:...
Company ViewModel
public void SaveChanges()
{
if (Company.Id == 0)
{
Company.CreatedById = CurrentUser.Id;
Company.Id = AppCore.BizObject.AddCompanyAsync(Company);
}
else
{
Company.LastModifiedById = CurrentUser.Id;
AppCore.BizObject.UpdateCompanyAsync(Company);
}
}
Again, the question is, how or where does the ID of the user get assigned to EVERY entity being passed to the back end?
If it's not broken, fix it until it is.
Everything makes sense in someone's mind.
Ya can't fix stupid.
|
|
|
|
|
Lots of options.
The constructors of the entities could set the information; calling a "shared" user "lookup".
Maybe user ids and actions should be logged; with only a reference to the entity id and a timestamp column value.
You could "crawl" the entities waiting to be committed and apply your "auditing" then.
Maybe you're tracking too many entities and only need to consider the parent / root of an object graph.
A combination of audit techniques that work well with the least fuss. Can you determine if someone is fudging with the data? Then your controls are adequate.
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
I have tried unit testing before, but I have only worked with very simple strings where I inserted some values. I wanted to try something different, so I found this template which is made for practising. It has a class containing an empty linked list.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace UnitListX
{
public class ListXwithErrors
{
private Node list;
private int size;
public static object Add;
public static int Size;
public ListXwithErrors()
{
list = null;
size = 0;
}
}
}
I have not gotten very far with the test code.
I would appreciate if anyone could provide me with an example of how to make a unit test of this kind of code.
My test code.
using System;
using System.Collections.Generic;
using System.Xml.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using UnitListX;
namespace UnitTestProject1
{
[TestClass]
public class ListTestClass
{
[TestMethod]
public void TestList()
{
ListXwithErrors node = new ListXwithErrors();
}
}
}
modified 13-Dec-19 14:40pm.
|
|
|
|
|
Okay, so I tried this.
I am not sure if this is the correct way to write it.
ListXwithErrors node = new ListXwithErrors();
node = null;
Assert.IsNull(node);
|
|
|
|
|
You're not getting far because your don't have a "list"; you have something you called a list.
And an "empty" list is "not null"; it is just "empty".
List<string> list = new List<string>();
bool isEmpty = (list.Count == 0);
It was only in wine that he laid down no limit for himself, but he did not allow himself to be confused by it.
― Confucian Analects: Rules of Confucius about his food
|
|
|
|
|
I have tried this method, but when writing
List<string> list = new List<string>(); I do not get the option to refer to the class in my other cs file.
Remember, I have two files here: Program.cs and UnitTest1.cs.
This is why this one is so confusing to me.
For example, if I had a ordinary class with normal strings such as:
public class Car
{
private string model;
private string colour;
public Car(string model, string colour)
{
this.model = model;
this.colour = colour;
}
I would just write this in my test:
[TestClass]
public class CarTestClass
{
[TestMethod]
public void TestCar()
{
Car mycar = new Car("Renault", "flame red");
Car myothercar = new Car("Volvo");
string mymodel = mycar.Model;
string mycolour = mycar.Colour;
string myothermodel = myothercar.Model;
string myothercolour = myothercar.Colour;
Assert.AreEqual("Renault", mymodel);
Assert.AreEqual("flame red", mycolour);
Assert.AreEqual("Volvo", myothermodel);
Assert.IsNull(myothercolour);
}
This is the method I am used to, which is why this list is confusing me.
|
|
|
|
|
So far so good, but I am basically coding in blindness at this point.
I got the first test to run.
[TestMethod]
public void Index()
{
List<string> list = new List<string>();
bool isEmpty = (list.Count == 0);
Assert.AreEqual(0, list.Count());
}
The next part of the code that I am going to test is this:
public int Length()
{
return size;
}
Using knowledge from the last test, I am... guessing this how I am supposed to test this part, but I am not sure what to write in Assert.
public void NumberOfObjects()
{
List<int> lenght = new List<int>();
lenght.Count();
}
I have googled and searched on places like Youtube, but I have yet to find a tutorial that talks about conducting unit testing on linked lists.
If you know of any website or tutorial that explains it, then I would be very happy.
|
|
|
|
|
How to code in C# to crate a printdocumentto preview like a filling form with boxes.
Bimal
|
|
|
|
|
You don't: a PrintDocument is not an interactive control, it provides no mechanism for user input.
You could conceivably add code to open a new form to fill in in the PrintDocument, but that really isn't what it's for (and the same code is called for the actual print do it's gonna get messy if you want anything to work properly).
Instead, create a form for the user to input his data, validate it, and store that - then pass it through to the PrintDocument for format for output.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
I am using Mysql.data.dll in c# project.
Now I called c++ dll function. But after calling c++ dll function, my sql connection fails.
Error code is
Project.exe Error: 0 : Unable to connect to any of the specified MySQL hosts.
Exception thrown: 'MySql.Data.MySqlClient.MySqlException' in MySql.Data.dll
Help me. How can i solve this issue?
|
|
|
|
|
That's not a "memory crash" or even close - it almost certainly means that your connections string is wrong, in some way.
Use the debugger, and look at exactly what your code is doing - we don't even have access to your code much less when it's running, so there is nothing at all we can do to help.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Thanks for you answer.
But until before call the c++ dll function, the gridview shows data of mysql db.
But if i click button, it calls c++ dll function and mysql connection error(Unable to connect to any of the specified mysql hosts) occurs. So datagrid not show data of database.
|
|
|
|
|
As I said, there is nothing at all we can do about that -0 we have no idea what code you are using, what your DLL method does - and we certainly can't run it under the same conditions as you because we have no access to your data (or any idea how to run your app).
Seriously, break out the debugger and start looking at exactly what is going on.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Doesn't mean that it is the cause; the error message hints that something else may be happening. Show us the code that you use that fails.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
I think you miss-posted.
"I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
You're right
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Doesn't mean that it is the cause; the error message hints that something else may be happening. Show us the code that you use that fails.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
IN c#
static class MyDll
{
[DllImport("mine.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void Test();
}
...
IN mine.dll:
...
extern "C"
__declspec(dllexport)
void Test() {
int a = 5;
}
...
But after i called MyDll.Test(), mysql.data.dll connect exception failed and datagrid not show anything.
|
|
|
|
|
The C# code using the MySQL provider, and your connection string. The code you show is not doing anything database, and will not be the source of the error.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
Unless the C function is doing more than was shown here, and is somehow corrupting the .NET process memory.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
..in exactly the MySQL data provider?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|