localhost数据库的SqlCommand连接字符串

时间:2014-05-19 18:29:46

标签: c# sql database-connection connection-string

我正在尝试在VS Express for Web 2013中创建一个简单的网站,该网站可以与数据库“部件”进行交互。我的数据库存储在app_data文件夹中。我能够在服务器资源管理器中查看连接,这意味着保存了连接字符串。但是,以下代码会引发2个错误:

  1. 错误13“System.Data.SqlClient.SqlCommand.SqlCommand(string,System.Data.SqlClient.SqlConnection)”的最佳重载方法匹配具有一些无效参数
  2. 错误14参数2:无法从'string'转换为'System.Data.SqlClient.SqlConnection'
  3. 我不知道如何解决这个问题。这是我的c#代码:

    using System;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class _Default : System.Web.UI.Page
    {
        protected void insertButton_Click(object sender, EventArgs e)
        {
            string connstring =     System.Configuration.ConfigurationManager.ConnectionStrings["connect"].ConnectionString;
            SqlCommand cmd = new SqlCommand("INSERT INTO PARTS VALUES('" + nameBox.Text + "', '" + descriptionBox.Text + "', '" + quantityBox.Text + "', '" + categoryList.SelectedValue + "')", connstring);
            cmd.ExecuteNonQuery();
        }
    }
    

    我对c#完全不熟悉,所以请记住这一点。谢谢你的帮助。

    更新:以下代码抛出两个错误,两个错误都是:

    Error   15  The name 'conn' does not exist in the current context
    

    我是c#的新手,但看起来代码没有任何问题。 “conn”这个名字在上面有明确的定义。

    using System;
    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    public partial class _Default : System.Web.UI.Page
    {
    
        protected void insertButton_Click(object sender, EventArgs e)
        {
            using (var conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connect"].ConnectionString))
            using (var cmd = new SqlCommand(
                "INSERT INTO PARTS VALUES(@name, @description, @quantity, @category)", conn))
            {
                cmd.Parameters.AddWithValue("name", nameBox.Text);
                cmd.Parameters.AddWithValue("description", descriptionBox.Text);
                cmd.Parameters.AddWithValue("quantity", quantityBox.Text);
                cmd.Parameters.AddWithValue("category", categoryList.SelectedValue);
                conn.Open();
                cmd.ExecuteNonQuery();
            }
    
    
        }
    }
    

3 个答案:

答案 0 :(得分:4)

using(var conn = new SqlConnection(connectionString))
{
    conn.Open();
    // use conn to create the command
}

但重要的是:您的SQL真的非常危险。这对SQL注入是开放的,这是一个巨大而轻松的攻击面。请请参考。

例如:

using(var conn = new SqlConnection(connectionString))
using(var cmd = new SqlCommand(
    "INSERT INTO PARTS VALUES(@name, @description, ...)", conn))
{
    cmd.Parameters.AddWithValue("name", nameBox.Text);
    cmd.Parameters.AddWithValue("description", descriptionBox.Text);
    //...
    conn.Open();
    cmd.ExecuteNonQuery();
}

(请注意,您需要自己添加一些内容;我已将其保留为不完整,仅举例namedescription

答案 1 :(得分:2)

您的配置中的连接值是什么?

你能试试吗

SqlConnection conn = new SqlConnection(connstring);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;

现在发出查询。

答案 2 :(得分:1)

您需要先创建SqlConnection

string connstring =     System.Configuration.ConfigurationManager.ConnectionStrings["connect"].ConnectionString;
SqlConnection conn = new SqlConnection(connstring);
SqlCommand cmd = new SqlCommand("INSERT INTO PARTS VALUES('" + nameBox.Text + "', '" + descriptionBox.Text + "', '" + quantityBox.Text + "', '" + categoryList.SelectedValue + "')"
                               , conn);
cmd.ExecuteNonQuery();

进入的一些早期习惯:

  • 不要连接SQL字符串。这有几个原因,其中最重要的是SQL注入攻击的漏洞。
  • using语句中包装您的连接和命令。这可以确保在出现异常时正确关闭连接。

最终结果如下:

string connstring = ConfigurationManager.ConnectionStrings["connect"].ConnectionString;
using(SqlConnection conn = new SqlConnection(connstring))
{
    string sql = "INSERT INTO PARTS VALUES(@name, @description, @quantity, @categoryList)"
    using(SqlCommand cmd = new SqlCommand(sql , conn))
    {
        cmd.Parameters.AddWithValue("@name", nameBox.Text);
        ... etc.

        cmd.ExecuteNonQuery();
    }
}