1

私は、コンパクト SQL サーバー (.sdf) とやり取りする小さな費用/収入追跡 C# コンソール プログラムに取り組んでいます。データベースは経費を保存し、簡単なコマンド ライン入力により、ユーザーは DB 内のインデックス番号に基づいてエントリを削除できます。これが私が得ているエラーです。

「クエリの解析中にエラーが発生しました。[トークン行番号 = 1、トークン行オフセット = 32、エラーのトークン = インデックス]」

以下は、エントリを削除するコードです。

else if (ans.Equals("REMOVE"))
        {
            Console.WriteLine("Which entry?");
            deleteTrans(Console.ReadLine(), conn);
            displayDB(conn);
        }
}

static void deleteTrans(string index, SqlCeConnection conn)
    {

        SqlCeCommand deleteCmd = new SqlCeCommand("DELETE FROM Transactions WHERE Index=" + index, conn);
        try
        {
            deleteCmd.ExecuteNonQuery();
        }
        catch (SqlCeException ex)
        {
            Console.WriteLine("You failed!\n" + ex.Message);
        }

    }

データベースには 5 つの列 (日付、説明、金額、コード、インデックス) があります。

日付- データ型 (bigint) - 長さ (8) - Null を許可 (はい) - 一意 (いいえ) - プリム キー (いいえ)

説明- データ型 (ncarchar) - 長さ (50) - Null を許可 (はい) - 一意 (いいえ) - プリム キー (いいえ)

金額- データ型 (金額) - 長さ (19) - Null を許可 (いいえ) - 一意 (いいえ) - プリム キー (いいえ)

コード- データ型 (nvarchar) - 長さ (4) - Null を許可 (いいえ) - 一意 (いいえ) - プリム キー (いいえ)

インデックス- データ型 (bigint) - 長さ (8) - Null を許可 (いいえ) - 一意 (はい) - プリム キー (いいえ)

4

1 に答える 1

0

IndexSQL CE の予約語であるため、角括弧で囲むか、(より良い) 予約語を使用しないように列の名前を変更する必要があります。

さらに、クエリを動的に生成するのではなく、次のようにパラメータ化する必要があります。

SqlCeCommand deleteCmd = new SqlCeCommand("DELETE FROM Transactions WHERE [Index]=@Index", conn);
var indParam = new SqlCeParameter("@Index", SqlDbType.BigInt, int.Parse(index));
deleteCmd.Parameters.Add(indParam);
try
{
    deleteCmd.ExecuteNonQuery();
}
catch (SqlCeException ex)
{
    Console.WriteLine("You failed!\n" + ex.Message);
}
于 2013-11-12T15:36:00.627 に答える