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