另外,如果你創建一個類與數據庫中的表匹配項的字段,你可以做各種事情與反思,使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();
}
等等。您可以使用這樣的反射來創建與您的類匹配的表,自動創建插入或過程調用,並且永遠不會使用不正確的數據類型或再次亂序。
該代碼位於何處?如果XML尚不存在,那麼表呢?它是否爲空? – Plutonix
是的,當程序啓動並且它在設計器中定義時,該表爲空。代碼位於函數中,該函數在窗體構造函數中調用。 – g2556
@ g2556你不能將某些東西添加到空變量中。 – user1666620