2012-03-22 98 views
0

以下兩個C#代碼示例,將信息寫入Access數據庫,據我所知,應該產生相同的輸出。然而,第一個工作,第二個出錯。C#表單/訪問數據庫插入行與「自動編號」字段

第一個代碼:沒有AutoNumber主鍵字段,效果很好。但直到我嘗試添加一行,其中任何字段沒有不同。我必須有自動編號唯一的ID,(對於缺乏unquity的明顯的原因)

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

第二個代碼:返回錯誤消息:

「其他信息:查詢數值和目標字段是不一樣的。「

據我所見,他們都有相同數量的字段。而且,還沒有唯一的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); 
+2

是不是你錯過了佔位符? '{0}'? – MilkyWayJoe 2012-03-22 20:27:55

+0

通過''插入「或」不插入「'你的意思是插入或更新? – 2012-03-22 20:28:10

+0

你在用什麼數據庫?你知道你可以在創建數據庫時添加自動增量選項。 – 2012-03-22 20:29:34

回答

2

試試這個:你插入SQL命令之後,執行另一個SQL調用:

SELECT @@IDENTITY 

返回將與剛剛添加的記錄相關聯的自動編號字段的結果。您的原始插入sql命令不應嘗試插入自動編號字段值。只是省略它。

另外,你的第二個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 
    ); 
+0

其實這兩個'string.Format'版本都應該代替使用參數化查詢 – 2012-03-22 20:48:39

+0

@ConradFrix:我不確定他是否使用DAO或ADO ...還不確定DAO是否支持參數。但原則上,你100%正確。 – code4life 2012-03-22 20:50:57

+0

當有人使用C#而不是System.Data.OleDb使用DAO或ADO時,參數化查詢支持是他們問題中最少的。 – 2012-03-22 21:00:48

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

注意:我的天堂」 t t 編輯:添加缺失昏迷

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;