从asp.net表单将数据插入SQL表

时间:2016-03-07 16:08:16

标签: c# asp.net sql-server

我正在尝试构建一个注册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开始的规范。

我不知道如何解决这个问题但是非常感谢任何帮助。

2 个答案:

答案 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