SQL 连接字符串在 C# 中无法识别并抛出异常

Posted

技术标签:

【中文标题】SQL 连接字符串在 C# 中无法识别并抛出异常【英文标题】:SQL connection string is not recognised and throws and exception in C# 【发布时间】:2020-12-27 02:54:56 【问题描述】:

上下文:我正在编写一个 WPF 应用程序。它与一个 SQL Server 数据库一起工作,我在其中放入了一些数据,具体是字符串 Titulo 和 Descriptcion、int XP 和字符串 fotoMision。当我单击一个按钮时,程序应该将此数据保存在数据库中。

问题:当我单击按钮时,它会在字符串连接的行中抛出一个异常,表明该对象没有被实例化。如果我将这些第一行放在InitializeComponent(); 行的正下方,那么第二行将无法识别miConexion 字符串。为什么会发生这种情况,我该如何解决?

代码:

static string miConexion = ConfigurationManager.ConnectionStrings["myProgress.Properties.Settings.DatosHabilidades"].ConnectionString;

SqlConnection miConexionSql = new SqlConnection(miConexion);

private void Button_Click(object sender, EventArgs e)

    string consulta = "INSERT INTO datosMisiones (Titulo, Descripcion, XP, fotoMision) VALUES (tituloMision, descripcionMision, xpMision, nuestroIconoMision";

    SqlCommand miSqlCommand = new SqlCommand(consulta, miConexionSql);

    miConexionSql.Open();

    miSqlCommand.Parameters.AddWithValue("@Titulo", tituloMision);

    miSqlCommand.ExecuteNonQuery();
    miConexionSql.Close();

【问题讨论】:

请说明您收到的确切错误消息 InitializeComponent(); 在您的代码片段中不存在,并且不清楚哪个特定行引发了错误。但是你的代码有很多问题,我建议你从一个很好的教程重新开始,讨论使用参数化查询更新数据库。 "对象未实例化" 这是否意味着您得到 NullReferenceException?它究竟发生在哪里? 【参考方案1】:

连接是短暂的,即您应该在单击按钮时创建一个,然后在执行查询后立即处理它。使用 using statement 隐式处理 IDisposable

private void Button_Click(object sender, EventArgs e)

    const string Consulta = "INSERT INTO datosMisiones (Titulo, Descripcion, XP, fotoMision) VALUES (tituloMision, descripcionMision, xpMision, nuestroIconoMision";
    string miConexion = ConfigurationManager.ConnectionStrings["myProgress.Properties.Settings.DatosHabilidades"].ConnectionString;
    using (SqlConnection miConexionSql = new SqlConnection(miConexion))
    using (SqlCommand miSqlCommand = new SqlCommand(Consulta, miConexionSql))
    
        miConexionSql.Open();

        miSqlCommand.Parameters.AddWithValue("@Titulo", tituloMision);

        miSqlCommand.ExecuteNonQuery();
        miConexionSql.Close();
    

【讨论】:

我照你说的做了,但它仍然给我这个异常:“对象引用未设置为对象的实例”,然后它再次显示连接字符串的行抛出了一个空值。 @***er:“myProgress.Properties.Settings.DatosHabilidades”是您的App.config 中的一个键吗?否则应该是string miConexion = ConfigurationManager.ConnectionStrings[myProgress.Properties.Settings.DatosHabilidades].ConnectionString;,不带引号。 好的,所以我设法在您回答后摆脱了该异常。谢谢!但它现在在 miSqlCommand.ExecuteNonQuery(); 中抛出了一个新异常;行,它显示以下内容:tituloMision 列的名称无效(以及其他三列)。这很奇怪,因为我的 SQL 数据库中没有任何名为 this 的列,为什么会发生这种情况? @***er: VALUES (tituloMision ... 在Consulta 查询字符串中应该是VALUES (@Titulo ... 或任何参数的名称。 @***er:但是如果您有其他问题,请提出一个新问题。我相信您最初的问题已经得到解答。【参考方案2】:

将连接字符串放在 form_load 事件上

【讨论】:

【参考方案3】:

SQL Server 数据库的连接字符串格式应如下所示:

"Data Source=DNS_or_IP_Address;Initial Catalog=DatabaseName;User Id=MyUser;Password=MyPassword"

Connection Strings and Examples for various databases

【讨论】:

好的,抱歉,我没有看到那个错误。我将其更改为 Visual Studio 给我的连接字符串示例(数据源=...;初始目录=DatosHabilidades;集成安全=True),它仍然拒绝工作。

以上是关于SQL 连接字符串在 C# 中无法识别并抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 调用 C++ dll 并抛出 SEHException

Spring AMQP RPC消费者并抛出异常

C#异常

连接 HSQL 数据库管理器时无法从 Java 代码连接到 HSQL 数据库

异常处理——捕获并抛出

sqlserver2008R2连接数据库异常,异常内容如下