|
I have two databases (I'll call them (A) and (B) for this discussion) that keep Customer information. (A) uses a system generated integer for the unique record ID and (B) uses its Company_Code and Customer_Code data fields as its unique record ID. I can change the database structure for (A) but not (B). I added Company_Code and Customer_Code fields to (A) so I can relate (A) and (B) customer records. If i'm working in a child record in (A) I know the interger for the customer, but I have to query the parent for the (B) key when I need information from (B). If i'm working in (B) I know the Company_Code, Customer_Code, but again, I have to query (A) parent record to get the correct integer value if I need information from (A). So I came up with the following solution that I need help with. (I should mention I'm a newbie programmer and would gladly consider other solutions)
1. I created a simple class:
public class CustomerIDPair: IComparer<CustomerIDPair>, IComparable<CustomerIDPair>
{
private string _company_Code = string.Empty;
private string _customer_Code = string.Empty;
public CustomerIDPair()
{
}
public CustomerIDPair(string Company_Code, string Customer_Code)
{
_company_Code = Company_Code;
_customer_Code = Customer_Code;
}
public string Company_Code
{
get { return _company_Code; }
set { _company_Code = value; }
}
public string Customer_Code
{
get { return _customer_Code; }
set { _customer_Code = value; }
}
public override string ToString()
{
return _company_Code.Trim() + ", " + _customer_Code.Trim();
}
#region IComparer<CustomerIDPair> Members
public int Compare(CustomerIDPair x, CustomerIDPair y)
{
string strX = x.Company_Code.Trim().PadLeft(3) + x.Customer_Code.Trim().PadLeft(10);
string strY = y.Company_Code.Trim().PadLeft(3) + y.Customer_Code.Trim().PadLeft(10);
return string.Compare(strX, strY, true);
}
#endregion
#region IComparable<CustomerIDPair> Members
public int CompareTo(CustomerIDPair other)
{
string strX = this.Company_Code.Trim().PadLeft(3) + this.Customer_Code.Trim().PadLeft(10);
string strY = other.Company_Code.Trim().PadLeft(3) + other.Customer_Code.Trim().PadLeft(10);
return string.Compare(strX, strY, true);
}
#endregion
}
2. I created 2 Dictionarys 'AtoB<int, CustomerIDPair>' and 'BtoA<CustomerIDPair, int>' , then populated them from A on application startup
Assume there is a customer that is identified in A as 14, and identifed as "EZE","TLC" in B
So:
AtoB[14] correctly evalates to a CustomerIDPair from with I can retrieve the company_Code and customer_Code.
But:
CustomerIDPair custID = new CustomerIDPair("EZE","TLC");
int test = BtoA[custId];
raises a KeyNotFoundException
Does anyone have any ideas how to make this work?
Thanks in advance
Russ
|
|
|
|
|
ret7679 wrote: But:
CustomerIDPair custID = new CustomerIDPair("EZE","TLC");
int test = BtoA[custId];
raises a KeyNotFoundException
This totally makes sense: you create a new CustomerIDPair object and try to locate it in the dictionary. But since you haven't added the newly created CustomerIDPair to the dictionary it simply doesn't exist there.
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
There is a CustomerIDPair in the BtoA Dictionary whose Company_Code is "EZE" and whose Customer_Code is "TLC" which was added when I created and populated the Dictionary. The problem seems to be in equating this new CustomerIDPair with the original.
|
|
|
|
|
You probably want something like this:
int id = -1;
foreach (CustomerIDPair pair in BtoA.Keys)
{
if (pair.Company_Code.Equals("EZE") && pair.Customer_Code.Equals("TLC"))
{
id = BtoA[pair];
break;
}
}
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Trying to delete duplicated data form a database.
I only need to delete specific information from a databae
var conn = new SqlConnection("Data Source =(local)\\Openhouse;" + ";Initial Catalog=" + _sqlDBName + ";Integrated Security=SSPI");
conn.Open();
var dataAdapter = new SqlDataAdapter();
var command = new SqlCommand(select, conn);
dataAdapter.SelectCommand= command;
var conDS = new ContactDs();
SqlCommand sqlcmd = conn.CreateCommand();
sqlcmd.CommandText = "DELETE FROM Contact WHERE IDNumber != '156' AND Quality = '40'";
dataAdapter.Fill(conDS, "Contact");
dataAdapter.DeleteCommand = sqlcmd;
dataAdapter.Update(conDS, "Contact");
private string select = "SELECT * FROM Contact";
Note I only need to delete information form this table and these columns. tested on sql server with studio manager works fine have problem in c# code.
Learning to Code
|
|
|
|
|
Could you be more descriptive about the problems you encounters?
Btw, var is not a C# keyword.
|
|
|
|
|
Le Centriste wrote: Btw, var is not a C# keyword.
Actually it is, in C# 3.5 and later.
However, I have seldom seen it more misused. The coder has obviously not read the documentation:
"Overuse of var can make source code less readable for others. It is recommended to use var only when it is necessary, that is, when the variable will be used to store an anonymous type or a collection of anonymous types."
Or perhaps he has chosen to totally disregard this recommendation.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Guffa wrote: Or perhaps he has chosen to totally disregard this recommendation.
Something we rarely see in real-life code.
|
|
|
|
|
Mo John wrote: conn.Open();
var dataAdapter = new SqlDataAdapter();
var command = new SqlCommand(select, conn);
dataAdapter.SelectCommand= command;
You don't need a data adapter to put the command in.
Mo John wrote: var conDS = new ContactDs();
You don't need a data set when you are not reading data.
Mo John wrote: dataAdapter.Fill(conDS, "Contact");
dataAdapter.DeleteCommand = sqlcmd;
dataAdapter.Update(conDS, "Contact");
There is no reason to read the data into a data set, as you are not using any of it. Also, setting the DeleteCommand property doesn't actually delete anything, it only specifies what to use when something is deleted.
Just execute the command:
using (SqlCommection conn = new SqlConnection("Data Source =(local)\\Openhouse;Initial Catalog=" + _sqlDBName + ";Integrated Security=SSPI")) {
SqlCommand command = new SqlCommand("DELETE FROM Contact WHERE IDNumber != '156' AND Quality = '40'", conn);
conn.Open();
command.ExecuteNonQuery();
}
Note: These five lines replaces all of your code. It also closes the database connection, which you didn't do in your code.
Are the IDNumber and Quality fields really text fields? If they are not, you should use numeric literals instead of string literals in the condition.
Although the != operator is supported by T-SQL, the <> operator is more widely known, and is supported by all SQL implementations.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
thanks I fiqure out with help form msdn
Learning to Code
|
|
|
|
|
Hi,
I made a Form derivated class and I'd like to put some code in the Load event so when I use it, it will get the application icon (if any) and show it in the top left corner (as any windows software). I saw I few methods but they assume I know the namespace and the icon name, but as I told you the form may be used in any application, so I have to find out those informations too...
Thanks,
Dirso
|
|
|
|
|
Dirso wrote: it will get the application icon (if any) and show it in the top left corner
An application can have many icons, which one do you want?
Dirso wrote: I saw I few methods but they assume I know the namespace and the icon name
Well, that's because you have to choose between the many potential icons that may exist in your application.
Dirso wrote: as I told you the form may be used in any application
Actually, you didn't. This is the first time you mentioned that piece of information.
|
|
|
|
|
Hi,
I want the main application icon. That one you choose in the application property window.
Thanks,
Dirso.
|
|
|
|
|
Try putting the following code in the constructor for your form. It should pick up the Icon for any app in which it is included.
<br />
this.Icon = Icon.ExtractAssociatedIcon(System.Reflection.Assembly.GetEntryAssembly().Location);<br />
Henry Minute
If you open a can of worms, any valid solution *MUST* involve a larger can!
|
|
|
|
|
It worked like a charm!!! Thank you so much!!!
|
|
|
|
|
how do you open the file browser dailog Using "Open" button click
|
|
|
|
|
craigMUTOKOKAI wrote: how do you open the file browser dailog Using "Open" button click
The same way as you'd handle any button click event.
In your event handler code you need to create an OpenFileDialog, set it up as you want (or not, if you are happy with the default behaviour) and then call ShowDialog() on it.
The DialogResult will indicate whether the user Cancelled the dialog or not.
|
|
|
|
|
DialogResult DialogResult_Logout = MessageBox.Show("Do you want to logout and return to Page Login?", "Logout", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (DialogResult_Logout == DialogResult.Yes)
{
UserControl_PageLogin_Visible(true);
}
Is this what you want?
nelsonpaixao@yahoo.com.br
trying to help & get help
|
|
|
|
|
Hello all,
can any body tell me how to release resources hold by thread before aborting it?
Is there a way to check what resources a thread is holding?
Thanks
|
|
|
|
|
Member 2324483 wrote: can any body tell me how to release resources hold by thread
Could you be more specific? What resources? How is the thread "holding" them?
led mike
|
|
|
|
|
here is the scenario.
My application has different dash boards and each dash board has different parts, which are loaded asynchronously. I am using remoting to make calls to server and load dashboard parts. There are different threads being created to load different dashboard parts and calls go over remoting channel asynchornously. When another dashboard is selected on UI, i am disposing all parts in current context and aborting threads being created, which some times freezing the UI. I am trying to find what could be the reason for UI freeze.
Please suggest me good debugging tools as well.
|
|
|
|
|
Member 2324483 wrote: i am disposing all parts in current context and aborting threads being created, which some times freezing the UI. I am trying to find what could be the reason for UI freeze.
Not good, see Guffa's reply. Don't abort threads.
led mike
|
|
|
|
|
Unless the code in the threads are specifically written to support abortion, you should not abort them. Aborting a thread means that an exception is thrown in the thread, which can be anywhere in the code. If not every single line in the code is written with this in mind, it is very likely that the code will crash and leave resources hanging.
Create a way to tell the threads that they should finish. That way you can let them clean up the resources in a well behaved manner before exiting. You can for example use a synchronised variable in the thread class that you change from the main thread.
Despite everything, the person most likely to be fooling you next is yourself.
|
|
|
|
|
Thanks Guffa, i removed abort code, my UI is working fine now. But, can you tell me from my scenario above, why UI is getting freezed? (FYI.. the other threads, which i have created are background threads).
|
|
|
|
|
It look like Guffa has left the building, so I'll have a go at this one
The only difference that setting IsBackground makes is that the thread cannot keep the process alive when it is being shut down. It is a bit of a kludge at the best of times.
As Guffa and led mike have said, using Abort is bad practice. The truth is, you can't know what the thread is doing when the ThreadAbortException is thrown - it will very likely be executing somewhere in the Framework ( in your case probably in something to do with Remoting ). This code may hold internal locks or other resources that are left abandoned by the exception. Orphaned locks will lead to deadlocks when other threads call into the same code, which I suspect is why your UI is freezing.
Abort exists for the CLR to use when tearing down a process. It should never be called by user code.
Nick
----------------------------------
Be excellent to each other
|
|
|
|