133*_*eyu 3 c# ms-access winforms
我对专业编程相对缺乏经验,但我正在尝试编写一个与MS Access数据库接口的程序.基本上我正在收集表单中的信息,并尝试在每个条目的新行传递信息.我有一个开放的OleDbConnection,我的测试显示我能够看到哪个行将有新条目,但是当我点击提交按钮时,catch中没有显示错误,但数据库保持不变.我最初在我从click事件调用的方法中获得了代码,但我只是将代码放到事件处理程序中以验证问题不在于调用.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
关于为什么这不写作的任何想法将非常感激.
您的代码中存在许多问题.
让我试着写一个替换代码
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();
}
Run Code Online (Sandbox Code Playgroud)
DATETIME是Access中的保留关键字,因此,如果要将其用于列名,则需要将其括在方括号中.
字符串连接在MSAccess中是一种不好的做法,但它是其他数据库中的致命缺陷,其中您的代码可用于Sql注入(在Access中更难但不是不可能).如果您在我的示例中使用参数化查询,则删除Sql Injection问题,但您还要让框架代码将正确的值传递给数据库引擎,并使用日期,字符串和小数所需的正确格式.
另一个要考虑的问题是没有全局OleDbConnection对象,而是在需要时创建,使用和销毁对象.该连接池将避免出现性能问题,并在无论出于何种原因连接失败你的代码将不会从内存泄漏遭受
我还要补充一点,你的GetXXXXX方法似乎都返回字符串.请记住,这些方法应返回与要写入的基础数据库字段兼容的值
| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |