繁体   English   中英

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

[英]How do I insert data into MS Access file using SQL?

我在将新数据插入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 ...

在同一网页上,单击Database Issue Checker Utility的链接。 该实用程序可以警告您应用程序中保留字的问题以及其他潜在的麻烦问题。

编辑 :如果PersonalData包含所需的其他字段且未分配默认值,则必须在INSERT语句中包含带有值的字段,否则肯定会失败。

假设txtUserName.TextFootxtPassword.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 baz,moo事情会变得更糟。 或者,众神禁止Bobby Tables

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

  1. 类型,用户名和密码都是(我认为)MS Access关键字。 虽然它们似乎在Access istself中使用时(例如在Querybuilder中),但它们似乎在从客户端代码中使用时抛出异常。 使用方括号在SQL语句中包围字段名,以便Access将它们视为文字。

  2. 我强烈建议您使用SQL参数作为内联SQL,然后使用ADO.NET参数来设置值。 谷歌“SQL注入攻击”来了解原因。 此外,它只是很好的实践(有一些有限的例外)。

编辑:请注意,对于OleDb,参数必须以与列表中的fliednames相同的顺序出现。 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);
            }
        }
    }
}

希望有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM