2009-08-11 2 views
4

У меня есть два набора данных, и мне нужно сравнить эти два набора данных, чтобы, если идентификатор не существует в одной таблице, тогда мне нужно написать вставить запрос Query else update.Сравнение двух наборов данных в C#

Для Ex:

Id in One dataset  ID in second Dataset  
1       1 
2       2 
3       4 

мне нужно вставить ID 3 ко второму набору данных.

Вот мой код для справки:

if (ds.Tables[0].Rows.Count > 0 || clientDS.Tables[0].Rows.Count > 0) 
     { 
      for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
      { 
       for (int j = 0; j < clientDS.Tables[0].Rows.Count; j++) 
       { 
        if (ds.Tables[0].Rows[i]["Id"].ToString() == clientDS.Tables[0].Rows[j]["Id"].ToString()) 
        { 
         client.GetSingleValue("update customers set Name='" + ds.Tables[0].Rows[i]["Name"].ToString() + "',ContactPerson= '" + ds.Tables[0].Rows[i]["ContactPerson"].ToString() + "',Address='" + ds.Tables[0].Rows[i]["Address"].ToString() + "',TinNo='" + ds.Tables[0].Rows[i]["TinNo"].ToString() + "',ContactNo='" + ds.Tables[0].Rows[i]["Contactno"].ToString() + "',Report= '" + ds.Tables[0].Rows[i]["Report"].ToString() + "',Sync=0,Ids='" + ds.Tables[0].Rows[i]["Id"].ToString() + "' where id='" + ds.Tables[0].Rows[i]["Id"].ToString() + "' "); 
        } 
        else 
        { 
         client.GetSingleValue("insert into customers(id,Name,ContactPerson,Address,TinNo,ContactNo,Report,Sync,Ids) values('" + ds.Tables[0].Rows[i]["Id"].ToString() + "', '" + ds.Tables[0].Rows[i]["Name"].ToString() + "','" + ds.Tables[0].Rows[i]["ContactPerson"].ToString() + "', '" + ds.Tables[0].Rows[i]["Address"].ToString() + "', '" + ds.Tables[0].Rows[i]["TinNo"].ToString() + "', '" + ds.Tables[0].Rows[i]["Contactno"].ToString() + "', '" + ds.Tables[0].Rows[i]["Report"].ToString() + "',0,'" + ds.Tables[0].Rows[i]["Id"].ToString() + "')"); 
        } 
       } 
      } 
     } 

Приведенный выше код не работает. Pls исправить мою проблему.

Благодаря

+0

Можете ли вы обрисовать как намеренный подход к работе, в основном записать шаги, которые вы хотите код взять? Я вижу, что здесь не так, но единственный способ исправить это - написать реальный код для вас, было бы лучше, если бы вы могли написать эти шаги, а затем мы можем указать на ошибки в этих шагах или ошибки в реализация. –

+6

Boo для не использования параметризованных запросов ... –

+1

Я думаю, вы можете сделать это во всех SQL, не нужно использовать приложение. слой. –

ответ

2

Я думаю, что ваша ошибка составляет строку Id, используя ==. Попробуйте использовать Equals. я бы просто использовать Еогеасп и выберите вместо:

foreach (DataRow row in ds.Tables[0].Rows) 
{ 
    string filter = string.Format("Id = '{0}'", row["Id"]); 
    DataRow[] rows = clientDS.Tables[0].Select(filter); 
    if (rows.length == 0) 
    { 
     // insert here 
    } 
    else 
    { 
     // update here 
    } 
} 
+0

Большое спасибо ... Это точный код, который я хочу .... Отлично !!! –

+2

Это C#, а не Java - '==' корректно работает для строк в C#. – MusiGenesis

1

Добавить оба этих таблиц (DataTable экземпляров) в наборе данных и добавить отношение.

DataSet ds = new DataSet(); ds.EnforceConstraints = false;

DataTable dt1 = new DataTable("A"); 
DataTable dt2 = new DataTable("B"); 

dt1.Columns.Add("ID", typeof(int)); 
dt1.PrimaryKey = new DataColumn[] {dt1.Columns[0]}; 
dt1.Rows.Add(1); 
dt1.Rows.Add(2); 
dt1.Rows.Add(3); 

dt2.Columns.Add("ID", typeof(int)); 
dt2.Rows.Add(1); 
dt2.Rows.Add(2); 
dt2.Rows.Add(4); 

ds.Tables.Add(dt1); 
ds.Tables.Add(dt2); 
ds.Relations.Add("ID_REL", dt1.Columns[0], dt2.Columns[0]); 

foreach (DataRow r in ds.Tables["A"].Rows) 
{ 
    DataRow []child=r.GetChildRows("ID_REL"); 
    Console.Write(r[0] + " "); 
    if (child.Length != 0) 
     Console.WriteLine(child[0][0]); 

    Console.WriteLine(); 
} 
6

Используйте метод Merge:

Dataset2.Merge(Dataset1); 

Это вставит в Dataset2 любые записи, которые находятся в DataSet1, но уже не в Dataset2. Примечание. В исходном вопросе вам предлагается вставить записи или обновить соответствующие записи из Dataset1, но ваши комментарии, похоже, предполагают, что вам действительно не нужно делать обновление. Метод Merge будет только вставлять новые записи из Dataset1.

+0

Это круто.Я никогда не видел или не использовал Merge() раньше. Отличная техника. –

+1

Наборы данных включают методы, позволяющие делать практически все, что вам нужно, с табличными данными, но программисты обычно пишут свои собственные сложные хаки, чтобы делать то же самое (этот вопрос дает некоторые превосходные примеры этого явления). – MusiGenesis

+1

Должны ли оба набора данных иметь одну и ту же схему? –

2
DataSet data1 
DataSet data2 

data1.Merge(data2,true) 

сольется data2 в data1 не перезаписать строки с таким же первичным ключом и добавить строки с несуществующим первичным ключом в data1.

data1.Merge(data2,false) 

сольется data2 в data1 перезаписана все строки и добавлять новые строки

Смежные вопросы