我正在尝试构建一个注册Web表单,将用户数据保存到SQL
表中。这就是我到目前为止所做的:
public static SqlConnection GetConnection()
{
String connection;
connection = @"example/file/path";
return new SqlConnection(connection);
}
protected void submitButton_Click(object sender, EventArgs e)
{
SqlConnection myConnection = GetConnection();
try
{
myConnection.Open();
String myQuery = "INSERT INTO RegistrationDB([firstName], [lastName], [eMail], [dob], [userName], [password]) values ('"
+fNameBox.Text+ "' ,'"+ lNameBox.Text+"' ,'"+emailBox.Text+"' ,'"
+ dobBox.Text+"', '"+userNameBox.Text+"' ,'"+passwordBox.Text+"';)";
SqlCommand myCommand = new SqlCommand(myQuery, GetConnection());
myCommand.ExecuteNonQuery();
myConnection.Close();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
myConnection.Close();
}
}
在我返回连接的GetConnection()
方法中发生错误。我得到的错误是:
发生了'System.ArgumentException'类型的异常 System.Data.dll但未在用户代码中处理
附加信息:初始化字符串的格式不符合从索引0开始的规范。
我不知道如何解决这个问题但是非常感谢任何帮助。
答案 0 :(得分:1)
你的问题在于
String connection;
connection = @"example/file/path";
return new SqlConnection(connection);
你的connectionString变量(在你的情况下为连接)没有正确设置,有多种方法可以做到这一点,只列出最常见的2个。
使用用户名和密码进行标准连接:
SqlConnection conn = new SqlConnection();
conn.ConnectionString =
"Data Source=ServerName;" +
"Initial Catalog=DataBaseName;" +
"User id=UserName;" +
"Password=Secret;";
conn.Open();
可信连接:
SqlConnection conn = new SqlConnection();
conn.ConnectionString =
"Data Source=ServerName;" +
"Initial Catalog=DataBaseName;" +
"Integrated Security=SSPI;";
conn.Open();
您可能需要查看此问题,例如: How to set SQL Server connection string?
答案 1 :(得分:0)
Pijemcolu
的答案是正确的,但我认为可以添加一些内容来增强您的代码:
1)使用变量的专有名称。例如:连接字符串与实际连接不同
public static SqlConnection GetConnection()
{
// if Windows Authentication is used, just get rid of user id and password and use Trusted_Connection=True; OR Integrated Security=SSPI; OR Integrated Security=true;
String connStr = "Data Source=ServerName;Initial Catalog=DataBaseName;User id=UserName;Password=Secret;";
return new SqlConnection(connStr);
}
2)尝试处理一次性物品(即工具IDisposable
)应妥善处理。
此外,命令不应使用字符串连接构建,而是使用参数。在向查询提供直接用户输入时,这一点尤其重要,因为恶意用户可能会尝试执行查询以破坏数据(请阅读有关SQL注入的更多信息here)。
只能在finally
块内关闭连接,因为无论什么都在执行(catch
块中引发的异常)。
protected void submitButton_Click(object sender, EventArgs e)
{
SqlConnection myConnection = null;
try
{
using (myConnection = GetConnection())
{
myConnection.Open();
String myQuery = @"
INSERT INTO RegistrationDB([firstName], [lastName], [eMail], [dob], [userName], [password])
values (@firstName, @lastName, @eMail, @dob, @userName, @password)";
using (SqlCommand myCommand = new SqlCommand(myQuery, GetConnection())
{
myCommand.Parameters.AddWithValue("@firstName", fNameBox.Text);
myCommand.Parameters.AddWithValue("@lastName", lNameBox.Text);
myCommand.Parameters.AddWithValue("@eMail", emailBox.Text);
myCommand.Parameters.AddWithValue("@dob", dobBox.Text);
myCommand.Parameters.AddWithValue("@userName", userNameBox.Text);
myCommand.Parameters.AddWithValue("@password", passwordBox.Text);
myCommand.ExecuteNonQuery();
}
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
finally
{
if (myConnection != null)
myConnection.Close();
}
}
3)密码存储
看起来您的存储密码是由用户输入的。强烈建议存储密码的表示形式(某种类型的散列很容易从字符串中计算出来,但几乎不可能从散列中检索字符串)。可以找到更多详细信息here。