C#中的插入命令没有错误,但数据未插入到MS SQL Server。

3

我正在尝试使用C#向Microsoft SQL Server数据库插入数据,插入命令能够正常执行且没有出现任何错误或异常。但是当我在SQL Server中检查我的数据库时,表格没有任何变化,记录也没有被插入到表格中。以下是我尝试的代码:

try
{
   SqlConnection con1 = new SqlConnection();
   con1.ConnectionString = "Server = (local); Database = My_DataBase; Integrated Security = true";
   con1.Open();
   SqlCommand cm1 = new SqlCommand();
   cm1.Connection = con1;
   cm1.CommandText = "insert into Users values('" + update.Message.Chat.Id.ToString() + "','" + update.Message.Chat.FirstName + "','" + update.Message.Chat.LastName + "','@" + update.Message.Chat.Username + "','" + req1.Status + "')";
   con1.Close();

}
catch(Exception e)
{
    Console.WriteLine(e.Message);
    continue;
}

我看到类似的问题在这里这里,但是回答并没有解决我的问题。
同时,当我手动向数据库插入数据并运行下面提到的选择命令时,可以得到正确的答案,但对于插入命令,我却不能得到正确的结果。
SqlConnection con2 = new SqlConnection();
con2.ConnectionString = "Server = (local); Database = My_DataBase; Integrated Security = true";
con2.Open();
SqlDataAdapter da1 = new SqlDataAdapter("select * from Users where ChatID='" + update.Message.Chat.Id.ToString() + "'", con2);
DataSet ds1 = new DataSet();
da1.Fill(ds1);
con1.Close();

请帮我解决这个问题。

顺便说一下,我知道这种插入方式不安全,我想让你知道这只是一个演示,我将使其免受SQL注入的攻击。


我对 .net/c# 没有什么概念,但它是否自动提交数据呢? - Utsav
你甚至有与你链接的第二个问题相同的问题。你没有执行任何地方... - James Z
1
既然你说要更改这个查询以防止 SQL 注入,为什么还要花这么多精力呢?你首先需要修复查询,然后再进行测试。并且要摆脱那个基本上是空的 catch。它会在你看到之前就写入控制台,然后就关闭了。 - Sean Lange
@Habib 我正在尝试在控制台应用程序中实现这个,我已经将我的代码放在try-catch块中以获取可能的异常,但是我没有得到任何异常,catch块中的代码也能正常工作。 - parisa
@JamesZ 主要的方案不会改变,而且控制台也不会关闭,因为程序是一个 Telegram 机器人,所以控制台会一直保持开启状态,直到机器人停止。我只是提到了一段代码。 - parisa
显示剩余2条评论
1个回答

7

您没有在任何地方执行您的命令。 您需要:

cm1.ExecuteNonQuery();

在你的代码中,你创建了一个SqlCommand对象,并将SqlConnection与之关联,但实际上你没有执行该命令。你的代码应该像这样:

   SqlConnection con1 = new SqlConnection();
   con1.ConnectionString = "Server = (local); Database = My_DataBase; Integrated Security = true";
   con1.Open();
   SqlCommand cm1 = new SqlCommand();
   cm1.Connection = con1;
   cm1.CommandText = "insert into Users values('" + update.Message.Chat.Id.ToString() + "','" + update.Message.Chat.FirstName + "','" + update.Message.Chat.LastName + "','@" + update.Message.Chat.Username + "','" + req1.Status + "'";
   cm1.ExecuteNonQuery();
   con1.Close();

除了SQL注入漏洞外,您还应考虑将SqlCommandSqlConnection对象包含在using语句中,这将确保正确处理未托管的资源。

谢谢Habib,你说得对,我忘记执行我的命令了。请进一步解释如何封装我的命令和连接。 - parisa
@parisa,这是一篇不错的阅读材料 https://www.codeproject.com/Articles/6564/Understanding-the-using-statement-in-C - Habib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接