-1

基本的に指定子のリストである文字列を宣言しています。ここで、yy はアルファ、xxxx は数値です。

string sMyString = "('yy-xxxx','yy-xxxx','yy-xxxx','yy-xxxx','yy-xxxx','yy-xxxx')";

if(File.Exists(sFileLocation + sFileName))
{
    txtRunning.Text = "Starting db copy";
    File.Copy(sFileLocation + sFileName, sFileName, true);
    File.Copy(sDbLocation + "clipper.dbf", "clipper.dbf", true);
    File.Copy(sDbLocation + "clipper.dbt", "clipper.dbt", true);

    txtRunning.Text = "Starting datatable population";
    string connString = @"Provider=VFPOLEDB;Data source=.\clipper.dbf";
    string mySelectQuery = "SELECT UPPER(TRIM(field1))," +
        " UPPER(TRIM(field2)), UPPER(TRIM(field3)), UPPER(TRIM(field4))" +
        " FROM `clipper` WHERE condition1 AND field1 IN " + sMyString +
        " ORDER BY field2;";

    DataTable dtClipper = new DataTable();
    DataTable dtNotFound = new DataTable();
    DataTable dTable = new DataTable();

    OleDbConnection conn = new OleDbConnection(connString);
    OleDbDataAdapter adapter = new OleDbDataAdapter();
    adapter.SelectCommand = new OleDbCommand(mySelectQuery, conn);
    adapter.Fill(dtClipper);
}

括弧を外すと、dataadapter.fill コマンドで関数が存在しないというエラーが表示されます。括弧の有無にかかわらず、文字列リテラルに変更すると、同じエラーが発生します。括弧と一重引用符を付けてそのままにしておくと、問題なく動作します。

発生カウンターとして使用するために辞書に追加しているので、一重引用符を付けずに、単なるリストにする必要があります。私が見逃しているのは何ですか?

4

1 に答える 1

2

そのエラーは、その文字列を使用して SQL クエリを実行しているためであり、引用符と括弧がないと無効な SQL です。

SQL クエリが機能するためには、引用符と括弧を保持する必要があります。プレーン文字列としてリストにアクセスする必要がある場合、リストとして保存します。

List<string> myStrings = new List<String> {
    "yy-xxxx",
    "yy-xxxx",
    "yy-xxxx",
    "yy-xxxx",
    "yy-xxxx",
    "yy-xxxx"
};
string myStringsForSQL = string.Join(myStrings, "','");

string mySelectQuery = "SELECT UPPER(TRIM(field1)), " +
    "UPPER(TRIM(field2)), UPPER(TRIM(field3)), UPPER(TRIM(field4)) " +
    "FROM `clipper` WHERE condition1 AND field1 IN ('" + myStringsForSQL + "') " +
    "ORDER BY field2;";
于 2012-08-28T18:09:45.453 に答える