2013-05-03 80 views
-1

有點小白說HY。 我在Microsoft Visual Studio 2010中有一個家庭作業項目的小問題。 另外,我在C#中工作。 我必須做一個網站銷售產品,我有一個Access數據庫。 所以,問題是這樣的:我寫了代碼,但它似乎有什麼錯,我不知道是什麼! 當我嘗試通過網站添加一個命令我收到一個錯誤:在OleDB中插入命令錯誤

Data type mismatch in criteria expression.

代碼是:

string date = DateTime.Now.ToShortDateString(); 
string string_baza_de_date = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\BogCs\Documents\Visual Studio 2010\WebSites\WebSite1\App_Data\magazin.mdb"; 
OleDbConnection ConexiuneSQL = new OleDbConnection(string_baza_de_date); 

ConexiuneSQL.Open(); 

int numar_total_de_produse = CheckBoxList1.Items.Count; // se numara produsele 

for (int i = 0; i < numar_total_de_produse; i++) // de la primul articol din CheckBoxList1 pana la ultimul 
{ 
    if (CheckBoxList1.Items[i].Selected == true) // daca am selectat un produs 
    { 
     // interogarea comenzii: 
     string interogare_adauga_comanda = "INSERT INTO comanda_finala (ID_comanda, ID_client, ID_produs, produs, tip_produs, data_comanda, pret) VALUES (" 
     + TextBox1.Text + ",'" + TextBox2.Text + "'," 
     + CheckBoxList1.Items[i].Value + ",'" + CheckBoxList1.Items[i].Text + "', 'Televizoare LED','" 
     + data_curenta + "','" + GridView3.Rows[i].Cells[3].Text.ToString() + "');"; 

     OleDbCommand comanda_inserare_comanda = new OleDbCommand(interogare_adauga_comanda, ConexiuneSQL); 

     comanda_inserare_comanda.ExecuteNonQuery(); 
    } 
} 

ConexiuneSQL.Close(); 

GridView3.Visible = false; 
Button1.Visible = false; 
Button2.Visible = false; 
CheckBoxList1.Visible = false; 
Label1.Visible = false; 
TextBox1.Visible = false; 
Label2.Visible = true; 

當我按下「添加命令」給我的錯誤,我不知道如何解決!

+1

你有嘗試調試代碼嗎?它在哪裏失敗? – 2013-05-03 19:53:28

+0

停止將所有數據放入SQL本身。使用參數化SQL,我懷疑問題會消失 - 以及SQL注入漏洞。 – 2013-05-03 19:57:08

+0

這對我來說有點難,因爲這是我第二次在這個程序中工作:))但我會嘗試跟隨谷歌教程! – user2348197 2013-05-03 20:04:38

回答

0

你有「'」,所以它看起來像在此之前和textbox1.text 後放:

string interogare_adauga_comanda = "INSERT INTO comanda_finala (ID_comanda, ID_client, ID_produs, produs, tip_produs, data_comanda, pret) VALUES ('" + TextBox1.Text + "','" + TextBox2.Text + "', " + CheckBoxList1.Items[i].Value + ",'" + CheckBoxList1.Items[i].Text + "', 'Televizoare LED','"+ data_curenta + "','" + GridView3.Rows[i].Cells[3].Text.ToString()+ "');"; 
+0

同樣的錯誤,但謝謝你的建議! – user2348197 2013-05-03 20:20:54

0

可能錯誤就在於一些用於構建命令的字符串。
像往常一樣,這是使用參數化查詢的第一個明顯的原因。
讓框架代碼根據當前數據庫的規則來格式化您的字符串。

最重要的原因然而,這是Sql Injecton problem

因此,讓我改變你的代碼,以這種方式來擺脫醜陋的字符串連接的

string interogare_adauga_comanda = "INSERT INTO comanda_finala (ID_comanda, ID_client, "+ 
            "ID_produs, produs, tip_produs, data_comanda, pret) " + 
            "VALUES (?,?,?,?,?,?,?)"; 

OleDbCommand comanda_inserare_comanda = new OleDbCommand(interogare_adauga_comanda, ConexiuneSQL); 
comanda_inserare_comanda.Parameters,AddWithValue("@p1",TextBox1.Text); 
comanda_inserare_comanda.Parameters,AddWithValue("@p2",TextBox2.Text); 
comanda_inserare_comanda.Parameters,AddWithValue("@p3",CheckBoxList1.Items[i].Value); 
comanda_inserare_comanda.Parameters,AddWithValue("@p4",CheckBoxList1.Items[i].Text); 
comanda_inserare_comanda.Parameters,AddWithValue("@p5","Televizoare LED"); 
comanda_inserare_comanda.Parameters,AddWithValue("@p6",data_curenta); 
comanda_inserare_comanda.Parameters,AddWithValue("@p7",GridView3.Rows[i].Cells[3].Text.ToString()); 
comanda_inserare_comanda.ExecuteNonQuery(); 

另外,請記住,你應該將值傳遞給具有數據庫字段所需的正確數據類型的參數。例如,如果你的第一場ID_comanda是數字那麼相對參數的行應改爲

comanda_inserare_comanda.Parameters,AddWithValue("@p1",Convert.ToInt32(TextBox1.Text)); 

,這引發了另一個問題。你是否檢查TextBox1中的文本是否真的是一個數字?

+0

這段代碼對我來說很難解釋,我的老師,原因是一個小考試,我們應該解釋爲什麼以及如何:))所以,像我這樣的noob,打開這個程序2次的noob將會有點過於聰明代碼:)關於TextBox1,yup是一個數字:) – user2348197 2013-05-03 20:33:36

+0

不要害怕這個。爲了改善您的知識,您每次採取的行動都應該受到歡迎順便說一下,這不是火箭科學,每一個在線教程建議使用參數,而不是字符串連接。嘗試自行搜索字符串'參數化查詢' – Steve 2013-05-03 20:47:22