我正在用訪問SQLCE數據庫的方法創建一個databasehelper類。我想使用相同的方法來讀取使用包含與不同表中的字段匹配的屬性的不同類的行。要使用的類是在運行時確定的,我希望將對象從類中的對象傳遞給方法,並獲取屬性名並使用它們讀取數據庫。將非常方便,因爲我可以將它用於我的所有(SQLCE-)數據庫。如何將包含一些屬性的類型爲custom-class的未知對象列表傳遞給方法?
(我更新了錯誤代碼,以便在這裏提供的解決方案)
#region ReadData
///----------------------------------------------------------------------
/// <summary>
/// Reads datarows from database and adds them to list.
/// </summary>
/// <param name="data">List containing objects with properties.</param>
/// <param name="table">Table in database.</param>
/// <param name="search">Substring of SQL-statement that follows 'WHERE'.</param>
/// <param name="connect">Connectionstring.</param>
/// <returns>true if successfull</returns>
///----------------------------------------------------------------------
public static bool ReadData<T>(List<T> data, string table, string search, string connect) where T : class, new()
{
// Return if input id missing
if (data == null || table == "" || connect == "") return false;
// retrieve properties from Data
PropertyInfo[] propinf = typeof(T).GetProperties();
// Create string with SQL-statement
string fields = "";
// retrieve fields from propinf
foreach (PropertyInfo p in propinf)
{
fields += fields == "" ? p.Name : ", " + p.Name;
}
// create SQL SELECT statement with properties and search
string sql = "SELECT " + fields + " FROM " + table;
sql += search == "" ? "" : " WHERE " + search;
// Instantiate and open database
SqlCeConnection cn = new SqlCeConnection(connect);
if (cn.State == ConnectionState.Closed)
cn.Open();
data.Clear(); // just in case
try
{
SqlCeCommand cmd = new SqlCeCommand(sql, cn);
cmd.CommandType = CommandType.Text;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable);
if (rs.HasRows) // Only if database is not empty
{
while (rs.Read()) // read database
{
// instantiate single item of list Data
var dataitem = new T();
int ordinal = 0;
foreach (PropertyInfo p in propinf)
{
// read database and
PropertyInfo singlepropinf = typeof(T).GetProperty(p.Name);
ordinal = rs.GetOrdinal(p.Name);
singlepropinf.SetValue(dataitem, rs.GetValue(ordinal), null); // fill data item
}
data.Add(dataitem); // and add it to data.
}
}
else
{
MessageBox.Show("No records matching '" + search + "'!");
return false;
}
}
catch (SqlCeException sqlexception)
{
MessageBox.Show(sqlexception.Message, "SQL-error.", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error.", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
finally
{
cn.Close();
}
return true;
}
#endregion
我有兩個問題:
1)我怎麼通過這個列表與未知類型?我到目前爲止發現的答案並沒有幫助我解決這個問題。
2)我如何實例化未知類型的對象(在編譯時)以將其添加到列表而不會導致編譯錯誤?
非常感謝!
是否應該在While(rs.Read())循環中移動_dataItem的創建?否則每次都會插入相同的_dataItem。也許我錯過了什麼? Regards Morten – Morten 2011-03-03 00:10:14
似乎對我來說。謝謝! – 2011-03-03 00:28:07
剛編輯的代碼 – 2011-03-03 00:31:06