首页 > 解决方案 > 在 sql 中插入新行不接受文本

问题描述

我想从用户输入在我的数据库中插入新行,我使用 C# 和 sql 插入语法。我的问题是当我运行一个程序时,所有字段都完全填写,除了文本值(产品名称)填充另一个数字(价格)我检查语法和代码,但它永远不会工作。

         public DataBaseManager (string DataBaseFilename)
{
    strFileName = DataBaseFilename;
    strFileNamenopath = System.IO.Path.GetFileName(strFileName);
    strAccessConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + System.IO.Path.GetFullPath(strFileName).Replace(System.IO.Path.GetFileName(strFileName), "") + "; Extended Properties=dBase III;Mode=ReadWrite";

    conn = new OleDbConnection(strAccessConn);

    conn.Open();
}

public void AddData(string Column, string value)
{
    try
    {
        int i = 0; 
        char[] delimiterChars = { ','};


        queryCutting = @"INSERT INTO [" + strFileNamenopath  + "] ( " + Column +  " ) VALUES ( " + value + " )";

        OleDbCommand cmd = new OleDbCommand(queryCutting, conn);
        string[] _valseperated = value.Split(delimiterChars);
        string[] _columnsbase = Column.Split(delimiterChars);


        foreach (string str in _columnsbase )
        {              
            cmd.Parameters.AddWithValue(str,SqlDbType.VarChar).Value =  _valseperated[i];
            i++;

        }
        cmd.ExecuteNonQuery();

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);        
    }

private void AddnewCode_Buttion_Click(object sender, RoutedEventArgs e)
        {
            _productBase.AddData("code, pv1, achat, designat", "123456789" +  ", " + Textbox_Achat.Text + ", " + Textbox_Achat.Text +", " + Produitsnom_TextBox.Text);

        }

column 的 value 代表数据库中的列名, value 是文本框的值。

Column = "code, pv1, achat, designat";
Value = "123456789, 10, 10, Productname";

queryCutting 的值

queryCutting = "INSERT INTO [produits.dbf] ( code, pv1, achat, designat ) VALUES ( 123456789, 540, 120, NewProduct)"

在此处输入图像描述

标签: c#database

解决方案


我想我已经理解了你的问题。您直接在查询文本中设置值字符串,因此您应该得到这个结果

   "INSERT INTO [theFolderName] (code, pv1, achat, designat) 
    VALUES ( 123456789, 10, 10, Productname )";

前三个值被接受为数字字段的正确值,并且不考虑这些字段的参数,但是当解析器到达ProductName “值”时,它不能用作值,因为它不是内引号。所以它认为它是一个参数并搜索参数集合。因为在 OleDb 中参数是位置的,所以它采用第一个参数并将其值传递给 OleDbCommand。第一个参数是代码。

这应该可以解决问题。不要给出参数名称(OleDb 不关心),让 OleDbCommand 使用按预期顺序给出的完整参数集

public void AddData(string Column, string value)
{
    try
    {
        char[] delimiterChars = { ','};

        // Query text is incomplete, we complete it inside the loop
        queryCutting = @"INSERT INTO [" + strFileNamenopath  + @"] 
                         ( " + Column +  " ) VALUES ( ";

        // The query and the connection will be set after the loop
        OleDbCommand cmd = new OleDbCommand();
        string[] _valseperated = value.Split(delimiterChars);
        string[] _columnsbase = Column.Split(delimiterChars);

        foreach (string str in _columnsbase )
        {              
            // The second parameter in AddWithValue is the Value not the type.
            cmd.Parameters.AddWithValue(str, _valseperated[i]);

            // Add a placeholder for each parameter
            queryCutting += "?,";
        }

        // Remove the ending colon an close the paren on the query text
        queryCutting = queryCutting.Substring(queryCutting.Length-1) + ")";
        cmd.CommandText = queryCutting;
        cmd.Connection = conn;
        cmd.ExecuteNonQuery();

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);        
    }
}

请注意,此代码不能解决您的 Sql 注入问题。您应该绝对确保您的用户没有键入自己,也没有输入文件名/文件夹,也没有输入列名,并从白名单中选择这些值


推荐阅读