【问题标题】:Syntax of SQL Server database connection string in c#C#中SQL Server数据库连接字符串的语法
【发布时间】:2017-06-11 23:29:57
【问题描述】:

我是 SQL 初学者,感谢您的关注。我在 Visual Studio 2015 中创建了一个数据库(通过使用“项目”菜单中的“添加新项目”并添加“基于服务的数据库”),现在我想连接到它并在其上读取或写入数据。

但我不知道如何通过代码连接它。

当我在服务器资源管理器中单击数据库时,我使用连接字符串中显示的字符串。

就在这里:

Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename="c:\users\soroush\documents\visual studio 2015\Projects\databasetest2\databasetest2\Database1.mdf";Integrated Security=True    

但是如你所知,当我将它复制并粘贴到一个可以在new sqlConnection(connection string) 中使用的字符串时,它不能使用,因为这个字符串有'\'或'"'

我连接到这个本地数据库的正确字符串是什么?

现在这是我的代码,但没用:

private void button1_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection(@"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = c:\users\soroush\documents\visual studio 2015\Projects\databasetest2\databasetest2\Database1.mdf; Integrated Security = True");
    con.Open();

    string t=@"INSERT INTO Table (Id,name) Values (34, 'John')";

    SqlCommand cmd = new SqlCommand(t, con);
    cmd.ExecuteNonQuery();

    con.Close();
}

private void button2_Click(object sender, EventArgs e)
{
    using (SqlConnection con = new SqlConnection(@"Data Source = (LocalDB)\MSSQLLocalDB; AttachDbFilename = c:\users\soroush\documents\visual studio 2015\Projects\databasetest2\databasetest2\Database1.mdf; Integrated Security = True"))
    {
        con.Open();
        string t = "SELECT * From Table";

        SqlCommand cmd = new SqlCommand(t, con);

        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            MessageBox.Show(reader["Id"].ToString() + reader["name"].ToString());
        }

        con.Close();
    }
}

感谢您的帮助

更新:我在写入和读取表格时遇到另一个错误

在您的帮助下,我想我已经连接到我的数据库了。现在我在阅读表格时遇到了另一个错误。这个错误指向

SqlDataReader reader = cmd.ExecuteReader();

在我的代码中说:

System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常附加信息:关键字“Table”附近的语法不正确。

并且在表格上写入错误指向

cmd.ExecuteNonQuery();

在我的代码中:

System.Data.dll 中出现“System.Data.SqlClient.SqlException”类型的未处理异常附加信息:关键字“Table”附近的语法不正确。

我的数据库有一个名为 Table 的表,其中包含两列:Id(int)name(nchar10)

【问题讨论】:

  • 我对连接字符串进行了尝试,但也没有用:>"Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename="+"c: \\users\\soroush\\documents \\visual studio 2015\\Projects\\databasetest2\\databasetest2\\Database1.mdf"+";Integrated Security=True"
  • 你试过用\"转义` with \`和"吗?
  • 去掉字符串中的引号,在字符串前面加一个@@"Data Source=...
  • 我删除了引号并在字符串前添加了一个@。我想我已经连接到数据库,但我有另一个错误。在执行cmd。 System.Data.dll 中发生“System.Data.SqlClient.SqlException”类型的未处理异常
  • 阅读 stackoverflow.com/a/13186810/34092stackoverflow.com/a/3501950/34092 。这些将向您展示如何使用 |数据目录|在连接字符串中。

标签: c# sql sql-server database


【解决方案1】:

你用来连接你的 Sql 数据库的代码是.. 嗯......真的很老派。我们只是不再那样做。

那么 - 我们能做些什么呢?让我们使用nice library called Dapper,这使得与 sql server 的“对话”变得非常容易、简单和安全。

首先,从 nuget 安装包 Dapper:

创建一个 POCO,它将代表从数据库返回的数据。

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

现在更新表单代码如下:

private const string _connectionString = @"Data Source = (LocalDB) <snipped..>";



private void button1_Click(object sender, EventArgs e)
{
    string query = "INSERT INTO Table (Id,name) Values (34, 'John')";
    int rowsInserted;
    using (var db = new SqlConnection(_connectionString))
    {
        rowsInserted = db.Execute(query);
    }

    if (rowsInserted != 1)
    {
        // Log/Handle the fact that you failed to insert 1 record;
    }
}

private void button2_Click(object sender, EventArgs e)
{
    IList<Foo> foos;

    using (var db = new SqlConnection(_connectionString))
    {
        const string query = "SELECT * FROM Table";
         // This will always return a list. It's empty or has items in it.
        foos = db.Query<Foo>(query).ToList();
    }

    foreach(var foo in foos)
    {
        MessageBox.Show($"{foo.Id} - {foo.Name}");
    }
}

这样干净吗?是的 - 我是这么认为的。

当然,我永远不会将数据库代码放在 winform 事件后面,而是放在专门的类等中。但我猜你只是在学习/玩耍/实验 :) :)

另外,我没有在其中放置错误处理,以保持示例较小。

【讨论】:

    【解决方案2】:

    变化:

    string t = "SELECT * From Table";
    

    到:

    string t = "SELECT * From [Table]";
    

    和:

    string t=@"INSERT INTO Table (Id,name) Values (34, 'John')";
    

    到:

    string t=@"INSERT INTO [Table] (Id,name) Values (34, 'John')";
    

    参见https://stackoverflow.com/a/695590/34092https://docs.microsoft.com/en-us/sql/t-sql/language-elements/reserved-keywords-transact-sql

    【讨论】:

      【解决方案3】:

      我的问题已经解决了 起初为了连接到数据库,我在连接字符串之前输入了一个@,并删除了字符串中的引号,正如@juergen d 在 cmets 中所说的那样

      第二次解决我在@mjwills所说的“表格”之前和之后键入[和]的表格的写入和读取错误

      @Pure.Krome 还解释了改进代码的更专业的方法

      谢谢大家

      【讨论】:

      • 祝你好运!也希望你不要被注入 sql。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多