【问题标题】:Can't connect to SQL Server with C# [closed]无法使用 C# 连接到 SQL Server [关闭]
【发布时间】:2017-03-24 20:33:27
【问题描述】:
private void button1_Click(object sender, EventArgs e)
{ 
    string connetionString = null;    

    SqlConnection cnn;
    connetionString = "My_Connection";

    cnn = new SqlConnection(connetionString);

    try
    {
        cnn.Open();

        SqlCommand cmd = new SqlCommand("INSERT INTO person " +
              "(name, lastname, phone) VALUES('@name', '@lastname', '@phone')");
        cmd.CommandType = CommandType.Text;
        cmd.Connection = cnn;

        cmd.Parameters.AddWithValue("@name", txtName.Text);
        cmd.Parameters.AddWithValue("@lastname", txtLastname.Text);
        cmd.Parameters.AddWithValue("@phone", Convert.ToInt32(txtPhone.Text));

        MessageBox.Show("Successful");

        cnn.Close();
    }
    catch (SqlException ex)
    {
        MessageBox.Show("You failed!" + ex.Message);
    }
}

【问题讨论】:

  • 在这种情况下相当明显,但您应该明确说明您收到的错误消息是什么。如果您打算引用配置文件中的连接字符串,您也应该声明并显示相关的配置 sn-p。并花时间将您的代码格式化为正常的编码约定(删除所有额外的空格)。
  • 你认为connetionString = "MyConnection" 会做什么?
  • My_Connection 应该是什么?
  • "My_Connection" 肯定是字符串,但它不是连接字符串。
  • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...

标签: c# sql-server


【解决方案1】:

此代码存在许多问题。您似乎正在尝试从配置文件中引用连接字符串。但是,您不能只将名称传递给连接 - 您必须实际检索它并将其分配给您的 SqlConnection。或者,您可以硬编码连接字符串,connectionstrings.com 上提供了很多示例。

但是,将连接字符串直接放在您的应用程序中通常不是一个好主意,因为您需要在整个应用程序中重复使用它们,并且最好将它们声明在一个中心位置。

private void button1_Click(object sender, EventArgs e)
{
    // retrieve connection from configuration file
    // requires a reference to System.Configuration assembly in your project
    string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["My_Connection"].ConnectionString;

    //alternatively, hardcode connection string (bad idea!)
    //string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;";

    using(SqlConnection connection = new SqlConnection(connectionString))
    using(SqlCommand command = new SqlCommand("INSERT INTO person (name, lastname, phone) VALUES(@name, @lastname, @phone)", connection))
    {
        // you should avoid AddWithValue here, see http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/
        // thanks marc_s! http://stackoverflow.com/users/13302/marc-s
        command.Parameters.AddWithValue("@name", txtName.Text);
        command.Parameters.AddWithValue("@lastname", txtLastname.Text);
        command.Parameters.AddWithValue("@phone", Convert.ToInt32(txtPhone.Text));
        connection.Open();
        command.ExecuteNonQuery();          
    }

    MessageBox.Show("Successful");
}

连接字符串在其构造函数中传递给连接,连接通过其构造函数传递给命令。

请注意,无需显式关闭连接,使用语句会为您处理这些。当变量超出范围时,即使出现异常也会关闭连接。

配置文件中的连接字符串示例:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <connectionStrings>
    <add name="My_Connection" providerName="System.Data.SqlClient" connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" />
  </connectionStrings>
</configuration>

【讨论】:

  • 很好的解释,这应该是公认的答案。不过,如果 OP 解释了他认为将其硬编码为 My_Connection 会做的事情,那将会有所帮助。
【解决方案2】:

您必须编写有效的连接字符串。如果你问连接字符串是什么?

这里是答案

'在计算中,连接字符串是一个字符串,它指定有关数据源的信息以及连接到它的方式。它以代码的形式传递给底层驱动程序或提供程序以启动连接。虽然通常用于数据库连接,但数据源也可以是电子表格或文本文件。

连接字符串可能包括驱动程序、服务器和数据库的名称等属性,以及用户名和密码等安全信息。'

类似的东西

Server=myServerAddress;Database=myDataBase;User Id=myUsername; Password=myPassword; 

在连接到另一台计算机上的 SQL Server 时,需要担心很多事情。

  • 机器的主机/IP地址
  • 初始目录(数据库名称)
  • 有效的用户名/密码

SQL 服务器通常可能作为默认实例运行,这意味着您可以简单地指定主机名/IP 地址,但您可能会遇到它作为命名实例(例如 Sql Express)运行的情况。在这种情况下,您必须指定主机名\实例名

【讨论】:

  • 也许你应该指出为什么当前的连接字符串无效,可以做些什么来修复它,或者如何从配置文件中提取它,其中可能有一个带有名称的连接字符串的“My_Connection”。
  • 你必须这样写 Server=myServerAddress;Database=myDataBase;User Id=myUsername;密码=myPassword;
  • 不用告诉我。我向您指出,它需要在您的答案中
  • 这里是连接字符串的解释
【解决方案3】:

您的连接字符串丢失!定义它或从您的配置中获取。 “My_Connection”不包含服务器、数据库、用户、密码。使用类似的东西:

var connectionString = "Data Source=ServerName; Initial Catalog=DataBaseName; User id=UserName; Password=Secret;";

【讨论】:

  • 继续……我明白你的意思。但是刚接触开发的人可能不知道您所说的缺失是什么意思,因为他们清楚地将某些东西分配给称为连接字符串的东西。你的答案应该明确描述解决方案是什么。
  • 是的,完全正确,再给我几秒钟。 :)
  • 没有办法知道谁对这个问题投了反对票,投票是匿名的。总之,这个问题太可怕了。它的格式很差,没有解释为什么他虽然“My_Connection”可能是有效的,没有说明相关的错误消息等。这个网站上的问题和答案的标准要高得多。
  • 同意,梅森。 :)
  • 不知道为什么这被否决了,这个答案完全正确。
【解决方案4】:
using (SqlConnection connection = new SqlConnection("Data Source=ServerName; Initial Catalog=DatabaseName;User ID=UserName;Password=Password"))
{
using (SqlCommand command = new SqlCommand())
{
    command.Connection = connection;            // <== lacking
    command.CommandType = CommandType.Text;
    command.CommandText = "INSERT INTO person " +
                  "(name,lastname,phone) VALUES('@name', '@lastname', '@phone')";
    cmd.Parameters.AddWithValue("@name", txtName.Text);
    cmd.Parameters.AddWithValue("@lastname", txtLastname.Text);
    cmd.Parameters.AddWithValue("@phone", Convert.ToInt32(txtPhone.Text));

    try
    {
        connection.Open();
        int recordsAffected = command.ExecuteNonQuery();
    }
    catch(SqlException)
    {
        // error here
    }
    finally
    {
        connection.Close();
    }
}
}

这是工作代码。

此致,

蒂亚古·拉金德兰

**如果有帮助,请将回复标记为答案,如果没有帮助,请取消标记。

【讨论】:

  • 不,他们很清楚地将 something 放在问题的连接字符串中。请再次阅读代码。当您将连接包装在 using 语句中时,绝对不需要在 finally 块中关闭连接。
  • 为什么在代码中添加“缺少”注释?缺少什么?为什么要在 finally 块中关闭连接?为什么您的代码没有按照 C# 约定正确格式化?
  • 你处理过数据库吗?您不应该让连接保持打开状态。在大型应用程序中,如果数据库只允许 5000 个连接,则在关闭之前的连接之前不允许新用户创建连接。
  • 自 2011 年以来,我一直在使用 C# 中的数据库。using 语句将关闭并为您处理连接。当你有一个 using 语句时显式关闭它是浪费时间和误导。
  • using 语句 - 未明确关闭的连接可能不会添加或返回到池中。我同意。如果连接被释放,有什么问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-22
  • 2015-08-29
  • 2016-11-08
相关资源
最近更新 更多