2016-08-21 26 views
0

我有一個數據集,它存儲在XML文件中。當應用程序啓動並且XML文件尚不存在時,我想將一些行添加到我的數據集並將其保存爲XML。我使用下面的代碼來做到這一點:無法將新行添加到數據表[c#]

 partiesDb = new Parties(); 

     //... 
     DataTable partyDsTable = partiesDb.Tables["party"]; //partiesDb is DataSet object 
     for (int i = 0; i < size; i++) 
     { 
      DataRow row = partyDsTable.NewRow(); // HERE THE CODE STOPS 
      row["sth"] = sth; 
      row["sth"] = "0"; 
      row["id"] = "1"; 
      if (!partyDsTable.Rows.Contains(row)) 
      { 
       partyDsTable.Rows.Add(row); 
      } 
     } 
     System.Windows.Forms.MessageBox.Show(partyDsTable.Rows[0]["sth"].ToString()); 
     partiesDb.WriteXml(path); 

並沒有任何反應。即使messagebox不顯示。該函數只是在創建一個新行時停止,我不知道爲什麼。你可以幫我嗎?

[編輯]: 此代碼工作正常:

  partiesDb = new Parties(); 
      DataTable dsTable = partiesDb.Tables["party"]; 
      DataRow dsRow = dsTable.NewRow(); 
      dsRow["name"] = ""; 
      dsRow["id"] = ""; 
      dsRow["votes"] = ""; 
      dsTable.Rows.Add(dsRow); 
      partiesDb.WriteXml(partiesDbPath); 

我不知道爲什麼這樣的作品,但是當我添加循環它不...

+0

該代碼位於何處?如果XML尚不存在,那麼表呢?它是否爲空? – Plutonix

+0

是的,當程序啓動並且它在設計器中定義時,該表爲空。代碼位於函數中,該函數在窗體構造函數中調用。 – g2556

+1

@ g2556你不能將某些東西添加到空變量中。 – user1666620

回答

1

您不能添加的東西到一個空變量。所以,如果它是空的,你需要實例化partyDsTable

DataTable partyDsTable = partiesDb.Tables["party"]; //partiesDb is DataSet object 

if(partyDsTable == null) // instantiate it 
    partyDsTable = new DataTable(); 

for (int i = 0; i < size; i++) 
{ 
    .... 
+0

我剛編輯過這個問題。我不確定數據表是否爲空,因爲我在嘗試添加行 – g2556

+0

@ g2556之前實例化了數據集,您確實需要將異常消息和內部異常(如果有)添加到您的問題中。我懷疑應用程序只是「停止」。 – user1666620

+0

沒有任何異常。應用程序不會停下來,我仍然可以在窗體上使用控件。 – g2556

0
DataTable partyDsTable = partiesDb.Tables["party"]; //partiesDb is DataSet object 
    for (int i = 0; i < size; i++)// "size" does not look like it's set to anything. If "size" is 0, then the loop will not loop. 
    { 

      partyDsTable.Rows.Add(new object[] {sth,"0","1"});//you should probably make the columns into the correct type if you are using integers. 

    } 
    System.Windows.Forms.MessageBox.Show(partyDsTable.Rows[0]["sth"].ToString()); 
    partiesDb.WriteXml(path); 
+0

大小不是0.我沒有使用整數。 – g2556

+0

@ g2556那你爲什麼要把'size'與一個整數比較,如果它不是一個整數? – user1666620

+0

我的意思是行中的屬性類型不是整數。 – g2556

0

另外,如果你創建一個類與數據庫中的表匹配項的字段,你可以做各種事情與反思,使usre你的數據是一件好事:

public static DataTable create_DataTable_From_Generic_Class(Type t) 
    { 
     DataTable d = new DataTable(); 
     FieldInfo[] fI = t.GetFields(); 
     for(int i = 0; i < fI.Length; i++) 
     { 
      DataColumn dC = new DataColumn(fI[i].Name, fI[i].FieldType); 
      d.Columns.Add(dC); 
     } 
     return d; 
    } 
    public static object[] Create_Datatable_Row_From_Generic_Class(Type t, object instance,DataTable dt) 
    { 

     FieldInfo[] f = t.GetFields(); 
     object[] ret = new object[f.Length]; 
     for (int i = 0; i < dt.Columns.Count; i++) 
     { 
      ret[i] = t.GetField(dt.Columns[i].ColumnName).GetValue(instance); 

     } 
     return ret; 

    } 
    public static List<string[]> getParams(Type type, bool convertToSQL) 
    { 


     List<string[]> ret = new List<string[]>(); 
     Dictionary<string, object> properties = new Dictionary<string, object>(); 
     foreach (FieldInfo prop in type.GetFields()) 
      properties.Add(prop.Name, prop.FieldType); 
     foreach (string key in properties.Keys) 
     { 
      string[] r = { key, properties[key].ToString().Replace("System.", "") }; 
      ret.Add(r); 
     } 
     if (convertToSQL) 
     { 
      return convertFromNetToSQLDataTypes(ret); 

     } 
     else 
     { 
      return ret; 
     } 
    } 
    private static List<string[]> convertFromNetToSQLDataTypes(List<string[]> list) 
    { 
     foreach (string[] data in list) 
     { 
      data[1] = data[1].Replace("Int16", "tinyint"); 
      data[1] = data[1].Replace("Int32", "int"); 
      data[1] = data[1].Replace("Int64", "bigint"); 
      data[1] = data[1].Replace("Double", "float"); 
      data[1] = data[1].Replace("Boolean", "tinyint"); 
      data[1] = data[1].Replace("Double", "float"); 
      data[1] = data[1].Replace("Long", "bigint"); 
      data[1] = data[1].Replace("String", "varchar(100)"); 
     } 
     return list; 
    } 
    public static object[] sql_Reader_To_Type(Type t, SqlDataReader r) 
    { 
     List<object> ret = new List<object>(); 
     while (r.Read()) 
     { 
      FieldInfo[] f = t.GetFields(); 
      object o = Activator.CreateInstance(t); 
      for (int i = 0; i < f.Length; i++) 
      { 
       string thisType = f[i].FieldType.ToString(); 
       switch (thisType) 
       { 
        case "System.String": 

         f[i].SetValue(o, Convert.ToString(r[f[i].Name])); 
         break; 
        case "System.Int16": 
         f[i].SetValue(o, Convert.ToInt16(r[f[i].Name])); 
         break; 
        case "System.Int32": 
         f[i].SetValue(o, Convert.ToInt32(r[f[i].Name])); 
         break; 
        case "System.Int64": 
         f[i].SetValue(o, Convert.ToInt64(r[f[i].Name])); 
         break; 
        case "System.Double": 
         // Console.WriteLine("converting " + f[i].Name + " to double"); 
         double th; 
         if (r[f[i].Name] == null) 
         { 
          th = 0; 
         } 
         else 
         { 
          if (r[f[i].Name].GetType() == typeof(DBNull)) 
          { 
           th = 0; 
          } 
          else 
          { 
           th = Convert.ToDouble(r[f[i].Name]); 
          } 
         } 
         try { f[i].SetValue(o, th); } 
         catch (Exception e1) 
         { 
          throw new Exception("can't convert " + f[i].Name + " to doube - value =" + th); 
         } 
         break; 
        case "System.Boolean": 
         f[i].SetValue(o, Convert.ToInt32(r[f[i].Name]) == 1 ? true : false); 
         break; 
        case "System.DateTime": 
         f[i].SetValue(o, Convert.ToDateTime(r[f[i].Name])); 
         break; 
        default: 
         throw new Exception("Missed data type in sql select in getClassMembers class line 73"); 

       } 
      } 
      ret.Add(o); 

     } 
     return ret.ToArray(); 


    } 

等等。您可以使用這樣的反射來創建與您的類匹配的表,自動創建插入或過程調用,並且永遠不會使用不正確的數據類型或再次亂序。

+0

我不明白這個代碼...請看我編輯的問題。 – g2556