【问题标题】:Insert command error in OleDB在 OleDB 中插入命令错误
【发布时间】:2013-05-03 19:50:49
【问题描述】:

一个小菜鸟说 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;

当我按下“添加命令”时,我出现了这个错误,我不知道如何解决!

【问题讨论】:

  • 你试过调试代码吗?哪里失败了?
  • 停止将所有数据放入 SQL 本身。使用参数化 SQL,我怀疑问题会随着 SQL 注入漏洞而消失。
  • 这对我来说有点难,因为这是我第二次在这个程序中工作:))但我会尝试按照谷歌教程!

标签: c# ado.net oledb out-of-memory sql-insert


【解决方案1】:

你必须在 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()+ "');";

【讨论】:

    【解决方案2】:

    可能错误在于您用于构建命令的某些字符串。
    像往常一样,这是使用参数化查询的第一个明显原因。
    让框架代码根据当前数据库的规则来格式化你的字符串。

    最重要的原因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中的文字是不是真的是数字吗?

    【讨论】:

    • 这段代码对我来说很难解释我的老师,因为这是一个小考试,我们应该解释为什么以及如何:)) 所以,像我这样的菜鸟,打开了 2 次这个程序会对那个代码有点太聪明了:)关于TextBox1,是的,是一个数字:)
    • 不要害怕。您为提高知识而采取的每一项行动都应该受到欢迎。顺便说一句,这不是火箭科学,每个在线教程都建议使用参数而不是字符串连接。尝试自己搜索字符串“参数化查询”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    相关资源
    最近更新 更多