gpt4 book ai didi

c# - 在 C# WinForm 应用程序中写入数据库时​​出现问题

转载 作者:行者123 更新时间:2023-11-30 13:58:22 29 4
gpt4 key购买 nike

我在专业编程方面相对缺乏经验,但我正在尝试编写一个与 MS Access 数据库接口(interface)的程序。本质上,我正在收集表单中的信息,并尝试在每个条目的新行中传递信息。我有一个打开的 OleDbConnection,我的测试显示我能够看到哪一行将有新条目,但是当我点击提交按钮时,捕获中没有显示错误,但数据库保持不变。我最初在从点击事件调用的方法中获得了代码,但我只是将代码移交给事件处理程序以验证问题与调用无关。

private void btnSubmit_Click(object sender, EventArgs e)
{

if (DBConnection.State.Equals(ConnectionState.Closed))
{
DBConnection.Open();
}

try
{
MessageBox.Show("Save Data at index: " + intRowPosition.ToString());

OleDbCommand OledbInsert = new OleDbCommand("Insert INTO RetentionTable (DateTime,Center,CSP,MemberID,ContractNumber,RetentionType,RetentionTrigger,MemberReason,ActionTaken,Other) VALUES('" + DateTime.Now.ToString() + "','" + GetCenter("") + "','" + GetName("") + "','" + GetMemberID("") + "','" + GetContractNumber("") + "','" + GetType("") + "','" + GetTrigger("") + "','" + GetReason("") + "','" + GetAction("") + "', + GetOther("")," DBConnection);

intRowPosition++;
}

catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
MessageBox.Show(ex.StackTrace.ToString());
}
finally
{
RefreshDBConnection();
}

}

任何关于为什么不写这篇文章的想法都将不胜感激。

最佳答案

你上面的代码有很多问题。

  • 首先,命令应该被执行,而不是简单地声明。 (这就是数据库没有被修改的原因)
  • 其次,你在你的语句中使用了保留关键字(所以即使你执行你的语句,它也会失败并抛出异常)
  • 第三,您连接字符串以构建命令文本。 A非常糟糕的举动会让您的应用程序容易受到 SQL injection 的影响攻击
  • 四、使用后应关闭连接

让我试着写一个替换代码

string cmdText = "Insert INTO RetentionTable " +
"([DateTime],Center,CSP,MemberID,ContractNumber,RetentionType," +
"RetentionTrigger,MemberReason,ActionTaken,Other) " +
"VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
using(OleDbConnection cn = new OleDbConnection(conString))
using(OleDbCommand cmd = new OleDbCommand(cmdText, cn))
{
cmd.Parameters.AddWithValue("@p1", DateTime.Now.ToString());
cmd.Parameters.AddWithValue("@p2", GetCenter(""));
cmd.Parameters.AddWithValue("@p3", GetName(""));
cmd.Parameters.AddWithValue("@p4", GetMemberID(""));
cmd.Parameters.AddWithValue("@p5", GetContractNumber(""));
cmd.Parameters.AddWithValue("@p6", GetType(""));
cmd.Parameters.AddWithValue("@p7", GetTrigger(""));
cmd.Parameters.AddWithValue("@p8", GetReason(""));
cmd.Parameters.AddWithValue("@p9", GetAction(""));
cmd.Parameters.AddWithValue("@p10", GetOther(""));
cmd.ExecuteNonQuery();
}

DATETIME 是 Access 中的保留关键字,因此,如果要将它用于列名,则需要将其括在方括号中。

字符串连接在 MSAccess 中是一种不好的做法,但在您的代码可用于 Sql Injections 的其他数据库中却是一个致命缺陷。 (在 Access 中更难,但并非不可能)。如果您像我的示例一样使用参数化查询,则可以消除 Sql 注入(inject)问题,而且还可以让框架代码以日期、字符串和小数所需的正确格式将正确的值传递给数据库引擎。

要考虑的另一点是不要拥有全局 OleDbConnection 对象,而是在需要时创建、使用和销毁该对象。 Connection Pooling将避免性能问题,并且无论出于何种原因连接失败时,您的代码都不会遭受内存泄漏

我还想补充一点,您的 GetXXXXX 方法似乎都返回字符串。请记住,这些方法应该返回与您要写入的基础数据库字段兼容的值

关于c# - 在 C# WinForm 应用程序中写入数据库时​​出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17450950/

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