-1

少し初心者はHYと言います。Microsoft Visual Studio 2010 の宿題プロジェクトで小さな問題があります。また、C# で作業しています。製品を販売するためのサイトを作成する必要があり、Access データベースを持っています。だから、問題はこれです:私はコードを書きましたが、何かが間違っているようで、何がわかりません! サイトごとにコマンドを追加しようとすると、次のエラーが表示されます。

条件式のデータ型が一致しません。

コードは次のとおりです。

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;

「コマンドの追加」を押すと、そのエラーが表示され、解決方法がわかりません!

4

2 に答える 2

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()+ "');";
于 2013-05-03T19:59:29.730 に答える
0

おそらく、コマンドの作成に使用された文字列の一部にエラーがあります。
いつものように、これがパラメーター化されたクエリを使用する最初の明白な理由です。
現在のデータベースのルールに従って、フレームワーク コードで文字列をフォーマットします。

ただし、最も重要な理由は、Sql Injecton の問題です。

このようにコードを変更して、醜い文字列連結を取り除きます。

 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 のテキストが本当に数字かどうかを確認しましたか?

于 2013-05-03T19:59:44.483 に答える