如何使用SQL将数据插入MS Access文件
本文关键字:MS Access 文件 插入 数据 何使用 SQL | 更新日期: 2023-09-27 18:16:07
我有一个问题插入新的数据到MS Access 2007文件。它说我有一个不正确的SQL语句。
这里有什么问题?我不擅长SQL。请指出我的错误。
try
{
// Open database connection.
objOleDbConnection.Open();
objOleDbCommand.CommandText =
"INSERT INTO PersonalData (Type, UserName, Password) VALUES ('" + cmbType.Text + "','" + txtUserName.Text + "','" + txtPassword.Text + "')";
// Execute creating table command.
objOleDbCommand.ExecuteNonQuery();
}
首先,您需要在文本数据周围加上引号:
@"INSERT INTO PersonalData (Type, UserName, Password) VALUES (" + cmbType.SelectedIndex + ",'" + txtUserName.Text + "','" + txtPassword.Text + "')";
然而,你最好把它转换成使用参数,因为你不必担心嵌入引号:
objOleDbCommand.CommandText = @"INSERT INTO PersonalData (Type, UserName, Password) VALUES (?, ?, ?)";
objOleDbCommand.Parameters.Add("Type", cmbType.SelectedIndex);
objOleDbCommand.Parameters.Add("UserName", txtUserName.Text);
objOleDbCommand.Parameters.Add("Password", txtPassword.Text);
Type和Password均为保留字。参见Access中的问题名称和保留字。
如果必须保留这些字段名,请在INSERT语句中将它们用方括号括起来,以便数据库引擎知道将它们解释为字段:
"INSERT INTO PersonalData ([Type], UserName, [Password]) VALUES ...
在同一网页上,遵循数据库问题检查工具的链接。该实用程序可以警告您应用程序中的保留字问题,以及其他潜在的麻烦问题。
Edit:如果PersonalData包含必需的附加字段,并且没有分配默认值,则必须在INSERT语句中包含这些带值的字段,否则肯定会失败。
设txtUserName.Text
为Foo
, txtPassword.Text
为bar
。然后你得到
INSERT INTO PersonalData (Type, UserName, Password) VALUES (3,foo,bar)
而不是语法正确的
INSERT INTO PersonalData (Type, UserName, Password) VALUES (3,'foo','bar')
因为你没有列foo
和bar
,你得到一个错误-是我的假设。如果你有baz,moo
而不是foo
,情况会更糟。或者,上帝保佑,Bobby Tables。
这里有几个地方可能会遇到问题。
-
Type, Username和Password都是(我认为)MS Access关键字。虽然它们在Access本身中使用时似乎可以工作(例如在Querybuilder中),但在客户端代码中使用时似乎会抛出异常。将SQL语句中的字段名用方括号括起来,以便Access将其视为字面量。
-
我强烈建议使用SQL参数的内联SQL,然后使用ADO。. NET参数设置值。谷歌"SQL注入攻击"了解原因。另外,这是一种很好的练习(有一些有限的例外)。
编辑:请注意,使用OleDb,参数必须以与列表中名称相同的顺序出现。这与ADO的情况不同;SQLClient。但是,使用Access时,打乱参数顺序将产生难以发现的问题…
你的SQL语句看起来像这样:
INSERT INTO ([Type], [Username], [Password]) VALUES ( @Type, @UserName, @Password )
你的代码可能像这样(我在这里做了一些自由…
private void InsertUserData(int Type, String UserName, String Password)
{
// The "Using" block handles object creation and disposal -
// handy for unmanaged resources like database connections:
using(OleDbConnection cn = new OleDbConnection(YourConnectionString))
{
using(OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = cn;
// 1. Note the use of Parameters here. This will hinder attempts to
// compromise your app with SQl Injection and/or faulty user input.
// 2. Also note that, since "Type", "Username", and "Password" are all
// MS Access keywords, there is a potential for problems when
// used as fieldnames. Therefore we enclose them
// in square brackets [] in the "INSERT INTO" Clause:
String SQL =
"INSERT INTO PersonalData([Type], [UserName], [Password]) " +
"VALUES(@Type, @UserName, @Password)";
// Set the CommandText Proprty:
cmd.CommandText = SQL;
// Now create some OleDb Parameters:
OleDbParameter prmType = new OleDbParameter("@Type", Type);
OleDbParameter prmUserName = new OleDbParameter("@UserName", UserName);
OleDbParameter prmPassword = new OleDbParameter("@Password", Password);
// Add the params to the parameters collection:
cmd.Parameters.Add(prmType);
cmd.Parameters.Add(prmUserName);
cmd.Parameters.Add(prmPassword);
try
{
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
希望有帮助…