如何使用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();
            }

如何使用SQL将数据插入MS Access文件

首先,您需要在文本数据周围加上引号:

@"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.TextFoo, txtPassword.Textbar。然后你得到

INSERT INTO PersonalData (Type, UserName, Password) VALUES (3,foo,bar)

而不是语法正确的

INSERT INTO PersonalData (Type, UserName, Password) VALUES (3,'foo','bar')

因为你没有列foobar,你得到一个错误-是我的假设。如果你有baz,moo而不是foo,情况会更糟。或者,上帝保佑,Bobby Tables。

这里有几个地方可能会遇到问题。

  1. Type, Username和Password都是(我认为)MS Access关键字。虽然它们在Access本身中使用时似乎可以工作(例如在Querybuilder中),但在客户端代码中使用时似乎会抛出异常。将SQL语句中的字段名用方括号括起来,以便Access将其视为字面量。

  2. 我强烈建议使用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);
            }
        }
    }
}

希望有帮助…