0

私が知る限り、Access データベースに情報を書き込む C# コードの次の 2 つのサンプルは、同じ出力を生成する必要があります。ただし、最初のものは機能し、2番目のものはエラーになります。

最初のコード:オートナンバー型の主キー フィールドがない場合、うまく機能します。ただし、どのフィールドも変わらない行を追加しようとするまでは。私は AUTONUMBER の一意の ID を持っている必要があります (不都合がないという明らかな理由により)

string vsql = string.Format("insert into Log values " +
    "('{0}','{1}',{2},{3},'{4}',#{5}#,'{6}')",
    comboBox1.Text,
    comboBox2.Text,
    int.Parse(textBox1.Text),
    int.Parse(textBox1.Text),
    textBox3.Text,
    textBox2.Text,
    addRemove
    );

2 番目のコード:エラー メッセージを返します。

「追加情報: クエリ値の数と宛先フィールドが同じではありません。」

私が見る限り、どちらも同じ数のフィールドを持っています。それでも、どちらにも一意の AUTONUMBER ID フィールドがありません。これは、コードを自動番号付けフィールドに「挿入」または「挿入しない」ようにする方法がわからないため、追加できません。繰り返しますが、明らかにフィールドが必要です。どんな助けでも大歓迎です!フォームが新しいレコードを送信すると、自動番号フィールドが自動的に更新される限り、どちらのコードも受け入れられます。

string vsql = string.Format("INSERT INTO Log (" +
    "Location, " +
    "Drug, " +
    "Quantity, " +
    "Strength, " +
    "Initials, " +
    "'Date'," +
    "add_Remove" +
    ") VALUES (" +
    comboBox1.Text,
    comboBox2.Text,
    int.Parse(textBox1.Text),
    int.Parse(textBox1.Text),
    textBox3.Text,
    textBox2.Text,
    addRemove);
4

3 に答える 3

3

これを試してください: insert sql コマンドの直後に、別の sql 呼び出しを実行します。

SELECT @@IDENTITY

返される結果は、追加されたばかりのレコードに関連付けられた autonumber フィールドになります。元の insert sql コマンドは、autonumber フィールド値を挿入しようとしてはなりません。省略してください。

また、2 番目の SQL テキストには問題があります。次のように再フォーマットします。

string vsql = string.Format("insert into Log (Location,Drug,Quantity,"+
   "Strength,Initials,Date,add_Remove values" +
   "('{0}','{1}',{2},{3},'{4}',#{5}#,'{6}')",
     comboBox1.Text,
     comboBox2.Text,
     int.Parse(textBox1.Text),
     int.Parse(textBox1.Text),
     textBox3.Text,
     textBox2.Text,
     addRemove
     );
于 2012-03-22T20:38:21.533 に答える
2

String.Format正しく使っているかどうかはわかりません

このコードを進化させてみてください:

string vsql = string.Format(
    "INSERT INTO Log ( Location, Drug, Quantity, Strength, Initials, [Date], add_Remove) "   +
    "VALUES ('{0}', '{1}', {2}, {3}, '{4}', '{5}', '{6}')",
    comboBox1.Text, comboBox2.Text, int.Parse(textBox1.Text), int.Parse(textBox1.Text),
    textBox3.Text, textBox2.Text, addRemove);

:私はテストしていません 編集:不足していたコマを追加しました

于 2012-03-22T20:39:03.860 に答える
1

しばらくの間、ウェブを検索し、得られた応答に頭を悩ませようとしました。どれも素晴らしい提案でした。これは「オッカムの剃刀」の好例です。「string vsql」行の前に次を挿入しましたが、魅力的に機能します。

回答してくれたすべての人に感謝します!

OleDbCommand dbCommand;
OleDbDataReader dbReader;
new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;data source=C:\MyDatabase.accdb");
dbCommand = new OleDbCommand("select count(*) as Record_Count from Log", vcon);
dbReader = dbCommand.ExecuteReader();
if (dbReader.Read() == true)
    rowCount = dbReader["Record_Count"].ToString();
else
    return;
于 2012-04-02T19:52:43.393 に答える