我有一个简单的查询来更新用户信息但是我得到错误说明'初始化字符串的格式不符合索引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";
答案 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();
}
}
}
编辑:
我为上面的代码创建了一个测试实验室,并且都运行正常。如果您有任何问题,请告诉我。
干杯。