我对C#比较陌生,正在开发一个与本地数据库(SQL Compact 3.5)通信的应用程序。运行标准的select语句我没问题 - 但是当涉及到将数据转换为C#时 - 我有点迷失。
到目前为止我所拥有的是一个'删除'查询,删除所有名为'Master'的行。 现在我已经知道我实际上需要在删除它们之前获取这些行的ID(出于数据库完整性目的)。我在运行标准选择查询时没有问题 - 我的问题是从SQL CE中选择行到C#应用程序(使用数组或数据表或任何最符合逻辑/方便的地方)。
这就是我现在所拥有的,但它只返回一个值,而不是选择:
string sql = "select listid from list where ShortDesc='Master'";
SqlCeCommand cmdGetOldMasterId = new SqlCeCommand(sql, DbConnection.ceConnection);
int oldKey = (int)cmdGetOldMasterId.ExecuteScalar();
Console.WriteLine("Old ID: " + oldKey);
我需要能够在每个返回的行上执行foreach {}循环。有什么想法我怎么能在C#中做到这一点?
答案 0 :(得分:6)
如果你假设你的sql语句返回的是更多的一行数据,你需要使用SqlCeDataReader而不是ExecuteScalar
string sql = "select listid from list where ShortDesc='Master'";
SqlCeCommand cmdGetOldMasterId = new SqlCeCommand(sql, DbConnection.ceConnection);
SqlCeDataReader reader = cmdGetOldMasterId.ExecuteReader();
while(reader.Read())
{
Console.WriteLine(reader[0].ToString());
// or, if your listid is an integer
// int listID = reader.GetInt32(0);
}
另一种可能性是使用SqlCeDataAdapter来填充DataTable(这样性能较差,但如果您需要稍后以其他方法处理数据,则更有用)
string sql = "select listid from list where ShortDesc='Master'";
SqlCeCommand cmdGetOldMasterId = new SqlCeCommand(sql, DbConnection.ceConnection);
SqlCeDataAdapter da = new SqlCeDataAdapter(cmdGetOldMasterId);
DataTable dt = new DataTable();
da.Fill(dt);
....
foreach(DataRow r in dt.Rows)
{
Console.WriteLine(r["listid"].ToString());
}
答案 1 :(得分:2)
SqlCeCommand
有几种执行方法
ExecuteNonQuery
- 执行不需要返回内容的sql ExecuteScalar
- 用于SELECT查询返回一个值(不要与一行混合)ExecuteReader
- 对于返回> = 0行http://msdn.microsoft.com/en-us/library/182ax5k8.aspx
var reader = cmdGetOldMasterId.ExecuteReader();
while(reader.Read())
{
// reader[0], reader[1]...
}