1

我对 C# 比较陌生,并且正在开发一个与本地数据库(SQL Compact 3.5)通信的应用程序。我很擅长运行标准的选择语句——但在将这些数据导入 C# 时——我有点迷失了。

到目前为止,我有一个“删除”查询,它删除了所有名为“主”的行。现在我发现我实际上需要在删除这些行之前获取它们的 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# 中做到这一点吗?

4

2 回答 2

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());
}
于 2013-02-06T13:09:46.140 回答
2

SqlCeCommand有几种执行方法

  • ExecuteNonQuery- 执行不需要返回东西的sql
  • ExecuteScalar- 对于返回一个值的 SELECT 查询(不要与一行混合)
  • ExecuteReader- 对于返回 >=0 行的 SELECT 查询

http://msdn.microsoft.com/en-us/library/182ax5k8.aspx

var reader = cmdGetOldMasterId.ExecuteReader();

while(reader.Read()) 
{
  // reader[0], reader[1]...
}
于 2013-02-06T13:09:13.670 回答