1

私はC#に比較的慣れておらず、ローカルデータベース(SQL Compact 3.5)と通信するアプリケーションを開発しています。私は標準のselectステートメントを実行しても問題ありませんが、そのデータをC#に取り込むことになると、少し迷子になります。

私がこれまでに持っているのは、「マスター」という名前のすべての行を削除する「削除」クエリです。これらの行を削除する前に、実際にそれらの行のIDを取得する必要があることがわかりました(データベースの整合性のため)。標準のselectクエリの実行に問題はありません-私の問題は、SQL CEからC#アプリケーションに行の選択を取得することです(配列やデータテーブル、または最も論理的/便利なものを使用して)

これは私が現在持っているものですが、選択ではなく、1つの値のみを返します。

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ステートメントが複数行のデータを返すと想定する場合は、ExecuteScalarの代わりにSqlCeDataReaderを使用する必要があります。

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);   
}

もう1つの可能性は、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-1つの値を返すSELECTクエリの場合(1つの行と混合しないでください)
  • 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 に答える