c# - 在 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)"
解决方案
我想我已经理解了你的问题。您直接在查询文本中设置值字符串,因此您应该得到这个结果
"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 注入问题。您应该绝对确保您的用户没有键入自己,也没有输入文件名/文件夹,也没有输入列名,并从白名单中选择这些值
推荐阅读
- redis - REDIS 服务器配置
- c# - ItemCommand 不适用于中继器和少数事件
- javascript - 调用 InitiateAuth 操作时发生错误(InvalidLambdaResponseException):无法识别的 lambda 输出
- python - *I 在 python 中的数字旁边是什么意思?
- neural-network - keras 中的 val_sample_weight 是什么?
- c# - 如何将不同的查询与投影与 C# MongoDB 驱动程序相结合
- installation - 我可以在 Ubuntu 18.04.1 上安装 bazel 吗?
- python - 窗口 10 上的最新蚊子没有运行
- php - 当我使用 json_encode 时,为什么 PHP 会四舍五入我的数字?
- hive - 我必须从下面提到的字符串中单独生成日期,因为它会在配置单元查询中每天更改