初始化字符串的格式不符合索引33处的规范

时间:2014-01-07 03:35:03

标签: c# database winforms ms-access visual-studio-2012

我有一个简单的查询来更新用户信息但是我得到错误说明'初始化字符串的格式不符合索引33处的规范'并且它似乎突出显示了这个特定的代码Connection.Close();但是我不是确定原因,这是完整的代码:

public void AddNewUser()
{
    string filePath;
    try
    {
        filePath = (Application.StartupPath + ("\\" + DBFile));
        connection = new System.Data.OleDb.OleDbConnection((ConnectionString + filePath));
        connection.Open();
        System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand();
        command.Connection = connection;
         // ---set the user's particulars in the table---
        string sql = ("UPDATE enroll SET SSN=\'"
                        + (txtSSN.Text + ("\', " + ("FirstName=\'"
                        + (txtFirstName.Text + ("\', " + ("LastName=\'"
                        + (txtLastName.Text + ("\' "
                        + (" WHERE ID=" + _UserID))))))))));
        command.CommandText = sql;
        command.ExecuteNonQuery();
        MessageBox.Show("Student added successfully!", "Registered");

    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString(), "Error");
    }
    finally
    {
       connection.Close();
    }
}

编辑:

以下是文件路径:

const string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"C:\\Users\\Zack\\My Documents\\Test\\Database.mdb";

const string DBFile = "C:\\Users\\Zack\\My Documents\\Test\\Database.mdb";

2 个答案:

答案 0 :(得分:0)

您的命令文本错误,您应该使用参数化查询,这里是正确的版本:

command.CommandText = "UPDATE enroll SET SSN= @ssn, FirstName = @fname, LastName = @lastName WHERE ID = @id";
command.Parameters.AddWithValue("@ssn", txtSSN.Text);
command.Parameters.AddWithValue("@fname", txtFirstName.Text);
command.Parameters.AddWithValue("@lastName", txtLastName.Text);
command.Parameters.AddWithValue("@id", _UserID);

连接字符串:

string conString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Users\Zack\My Documents\Test\Database.mdb'";

答案 1 :(得分:0)

扎克,

此代码存在很多问题。如果你要运行它(如SLacks所述),那么你可以使用sql注入攻击。 (阅读它)。

首先关闭..运行时你的连接字符串(基于你的代码)将是。

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"C:\\Users\\Zack\\My Documents\\Test\\Database.mdb\\C:\\Users\\Zack\\My Documents\\Test\\bin\Debug\\C:\\Users\\Zack\\My Documents\\Test\\Database.mdb

那是猜测。您应该使用以下内容(请注意您的路径是硬编码的)。

const string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"{0}\"";

const string DBFile = "Database.mdb";
//...
var connection = new System.Data.OleDb.OleDbConnection(ConnectionString)

如果您想使连接字符串动态化为路径,请尝试此操作。

string conString = string.Format(ConnectionString, Path.Combine(Application.StartupPath, DBFile));
var connection = new System.Data.OleDb.OleDbConnection(conString);

这应该将您的连接字符串正确设置为应用程序启动。现在,您可能会发现执行程序集路径的工作与应用程序启动(您的调用)相比更有用。

接下来你的查询很乱。我已经清理它以使用参数化查询,而不是使用结果代码。 (注意这还没有经过测试)。

const string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\"{0}\"";

const string DBFile = "Database.mdb";
public void AddNewUser()
{
    string conString = string.Format(ConnectionString, Path.Combine(Application.StartupPath, DBFile));
    using (var connection = new System.Data.OleDb.OleDbConnection(conString))
    {
        try
        {
            string sql = "UPDATE enroll SET SSN=@ssn, FirstName=@firstName, LastName=@lastName WHERE ID=@userID";
            System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand(sql, connection);
            command.Parameters.AddWithValue("@ssn", txtSSN.Text);
            command.Parameters.AddWithValue("@firstName", txtFirstName.Text);
            command.Parameters.AddWithValue("@lastName", txtLastName.Text);
            command.Parameters.AddWithValue("@userID", _UserID);

            connection.Open();
            command.ExecuteNonQuery();
            MessageBox.Show("Student added successfully!", "Registered");

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString(), "Error");
        }
        finally
        {
            connection.Close();
        }
    }
}

编辑:

我为上面的代码创建了一个测试实验室,并且都运行正常。如果您有任何问题,请告诉我。

干杯。