为啥我的查询不会在我的代码中执行,而它在普通 sql 中执行得很好?
Posted
技术标签:
【中文标题】为啥我的查询不会在我的代码中执行,而它在普通 sql 中执行得很好?【英文标题】:Why won't my query execute in my code, while it executes just fine in normal sql?为什么我的查询不会在我的代码中执行,而它在普通 sql 中执行得很好? 【发布时间】:2019-05-27 12:12:03 【问题描述】:我在为学校制作项目时遇到了一个问题,我们应该将数据从 .txt 文件导入到我们的 C# 数据库中。我以为我已经弄清楚了,但是我的“插入”行没有将数据插入到我的表中。所以,最后,我尝试只插入 1 行,所有值都写入,它仍然不会将数据插入到数据库中。
我通过右键单击我的表并从我的代码中复制粘贴插入行来尝试“新查询”选项,并且效果很好,所以我不知道为什么代码中的行不起作用.
class Program
static void Main(string[] args)
string connectionString = @"Data Source= (LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|BazaPRO2.mdf;Integrated Security=True;Connect Timeout=30";
SqlConnection dataConnection = new SqlConnection(connectionString);
string q;
dataConnection.Open();
q = "INSERT INTO Sola(SolaID,Naziv,Naslov,Kraj,Posta,Telefon,Eposta) VALUES(1,'Test','Test','Test',1000,'Test','Test')";
SqlCommand dataCommand = new SqlCommand(q, dataConnection);
try
dataCommand.ExecuteNonQuery();
Console.WriteLine("Success");
dataConnection.Close();
catch Console.WriteLine("Fail");
我尝试将 executenonquery 行粘贴到 try 块中,它确实在我的屏幕上显示“Success”,但插入行没有执行。
【问题讨论】:
你忘记提交了。 @AviMeltser 这是自动提交模式,或者没有启动事务。所以我怀疑这是问题所在。 可能会受益于检查工作示例并使用参数而不是纯文本 - ***.com/questions/12939501/…ExecuteNonQuery
返回受影响的行数。检查一下,如果你得到一个,那么当你检查是否插入了记录时,你可能正在查看错误的数据库。
插入几乎肯定会执行。另一方面,您验证它正在发生的方式是另一回事。特别是,AttachDbFileName
可能不是 work like you think it does。
【参考方案1】:
检查dataCommand.ExecuteNonQuery();
(整数值)的返回值是否返回-1 出现问题(for example a transaction rollback)。如果为 0,则不会影响任何行。
int return_value = dataCommand.ExecuteNonQuery();
if(return_value > 0)
//goood :)
else
//something wrong :(
编辑:
顺便说一句,在使用命令后最好像下面这样处理命令:
string connectionString = @"Data Source= (LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|BazaPRO2.mdf;Integrated Security=True;Connect Timeout=30";
SqlConnection dataConnection = new SqlConnection(connectionString);
dataConnection.Open();
string q = "INSERT INTO Sola(SolaID,Naziv,Naslov,Kraj,Posta,Telefon,Eposta) VALUES(1,'Test','Test','Test',1000,'Test','Test')";
using(SqlCommand dataCommand = new SqlCommand(q, dataConnection))
try
dataCommand.ExecuteNonQuery();
Console.WriteLine("Success");
catch Console.WriteLine("Fail");
dataConnection.Close();
EDIT2:考虑 cmets 中的问题。
你在说|DataDirectory|
是"search in the application path for that dasabase",如果你正在调试你的应用程序,这意味着它会在输出调试文件夹中搜索数据库...具有相对/绝对路径的应用程序目录(查看AppDomain.SetData
方法)或将您的数据库复制到您的应用程序目录中......在不知道您的目标的情况下很难回答您:)
更具体地说,在初始化 SqlConnection 之前调用以下代码:
AppDomain.SetData("DataDirectory", "C:\\TEST\\");
设置您的|DataDirectory|
指向您的数据库路径。
【讨论】:
using
还是最好的
没有事务就不能回滚,这里也没有事务。任何会导致此单个语句隐式回滚的错误也会导致SqlException
,这意味着您永远无法进行此检查。只有当INSERT
被不影响行的INSTEAD OF
触发器吃掉时,这段代码才会真正执行(然后,可以说,这是设计使然)。总结一下:对于单个INSERT
,检查ExecuteNonQuery
的结果没有实际意义(这很好,因为人们会一直忘记这一点)。
感谢您的解释 :) 但是答案中的 msdn 注释很清楚 如果没有检测到有助于计数的语句,则返回值为 -1。如果发生回滚,返回值也是-1。即使是触发器也可以产生插入回滚,我们无法知道他的数据库结构,所以测试插入的返回值我认为仍然是一个好主意:) (顺便说一句,我不确定触发错误是否会生成异常或 -1... 我应该尝试)
触发器可以“静默”回滚语句,而无需同时执行RAISERROR
向客户端发出该语句已回滚的信号,并且如果您指望像这样的触发器检查值可能是有意义的。不过,可以说让触发器产生错误更有意义,因为您无法知道为什么否则它会回滚。我不会以此为理由在任何地方插入这样的检查,特别是因为如果使用SET NOCOUNT ON
(这很常见),它们将不起作用。在这种情况下它不会受到伤害,但它可能也无济于事。
@Legion 所以我尝试检查 int 值,结果为 1,然后我将 dataCommand 放入 using 块中,如你所说,我的数据库中仍然没有插入任何内容。我现在尝试的奇怪的事情是为我的数据库设置一个绝对路径,所以除了 BazaPRO2.mdf 之外的整个路径,当我这样做时,插入行实际上起作用了。问题是如果我把绝对路径留在里面,当我交出我的分配时,这条线就不起作用了。以上是关于为啥我的查询不会在我的代码中执行,而它在普通 sql 中执行得很好?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 gitlab-ci.yml 在 npm run test 上一直崩溃,而它在代码编辑器中工作?
Javascript - 无法发布数据(使用 axios),而它在邮递员中工作。为啥?
为啥这会给我一个 Java 中的 ClassCastException,而它在 C++ 中运行良好?