gpt4 book ai didi

c# - 使用此 INSERT INTO 语句和 .NET OleDb 命名空间时如何解决语法错误?

转载 作者:太空宇宙 更新时间:2023-11-03 17:22:28 25 4
gpt4 key购买 nike

当我尝试将值插入 Access 数据库时,我不断收到错误消息。

错误是语法错误,导致以下异常:

OleDbException was unhandled Syntax error in INSERT INTO statement.

private OleDbConnection myCon;

public Form1()
{
InitializeComponent();
myCon = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\File.mdb");
}

private void insertuser_Click(object sender, EventArgs e)
{
OleDbCommand cmd = new OleDbCommand();
myCon.Open();
cmd.Connection = myCon;
cmd.CommandType = CommandType.Text;

cmd.CommandText = "INSERT INTO User ([UserID], [Forename], [Surname], " +
"[DateOfBirth], [TargetWeight], [TargetCalories], [Height]) " +
"VALUES ('" + userid.Text.ToString() + "' , '" +
fname.Text.ToString() + "' , '" +
sname.Text.ToString() + "' , '" +
dob.Text.ToString() + "' , '" +
tarweight.Text.ToString() + "' , '" +
tarcal.Text.ToString() + "' , '" +
height.Text.ToString() + "')";

cmd.ExecuteNonQuery();
myCon.Close();
}

最佳答案

好吧,您还没有指定错误是什么 - 但您的第一个问题是您将数据直接插入到 SQL 语句中。 不要那样做。你在邀请SQL injection attacks .

使用 parameterized SQL statement反而。一旦你这样做了,如果你仍然有问题,用新代码编辑这个问题并说出错误是什么。新代码可能已经更清晰了,因为不会涉及大量的串联,很容易隐藏诸如不匹配的括号之类的东西。

编辑:如评论中所述,Jet/ACE 容易受到较少类型的 SQL 注入(inject)攻击,因为它不允许 DML。对于此 INSERT 语句,实际上可能没有漏洞 - 但对于以类似方式编写的带有 WHERE 子句的 SELECT,用户输入可能会绕过 WHERE 子句的某些保护。我强烈建议您理所当然地使用参数化查询:

  • 它们意味着您不必转义用户数据
  • 他们将数据与代码分开
  • 如果您从 Jet/ACE 迁移(无论是迁移这个特定代码,还是您个人开始处理不同的数据库),您就不用担心了
  • 对于日期等其他数据类型,您无需做任何工作即可将数据转换为适合数据库的格式

(您也不需要对 ToString 的所有调用。我不仅希望名为 Text 的属性已经字符串,但您正在使用字符串连接的事实意味着字符串转换无论如何都会自动发生。)

关于c# - 使用此 INSERT INTO 语句和 .NET OleDb 命名空间时如何解决语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4627552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com