我目前正在开发一个C#项目,我正在运行一个插入查询,它也同时进行选择,例如:
INSERT INTO table (SELECT * FROM table WHERE column=date)
Run Code Online (Sandbox Code Playgroud)
有没有办法可以看到在此查询期间插入了多少行?
试图弄清楚它是否最好使用,ExecuteScalar或者ExecuteNonQuery我是否想要返回新插入行的标识列.我已经阅读了这个问题并且我理解那里的差异,但是当我查看几周前我写的一些代码时(虽然从这个网站大量借用)我发现在我使用的插件中ExecuteScalar,就像这样:
public static int SaveTest(Test newTest)
{
var conn = DbConnect.Connection();
const string sqlString = "INSERT INTO dbo.Tests ( Tester , Premise ) " +
" VALUES ( @tester , @premise ) " +
"SET @newId = SCOPE_IDENTITY(); ";
using (conn)
{
using (var cmd = new SqlCommand(sqlString, conn))
{
cmd.Parameters.AddWithValue("@tester", newTest.tester);
cmd.Parameters.AddWithValue("@premise", newTest.premise);
cmd.Parameters.Add("@newId", SqlDbType.Int).Direction = ParameterDirection.Output;
cmd.CommandType = CommandType.Text;
conn.Open();
cmd.ExecuteScalar();
return (int) cmd.Parameters["@newId"].Value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这对我需要的东西很好,所以我很想知道
ExecuteNonQuery …我正在使用存储过程在表中插入一些值.
CREATE PROCEDURE [dbo].[Sp_InsertValue]
@Val1 as nvarchar(50)
@Val2 as nvarchar(50)
as
BEGIN
IF NOT EXISTS(SELECT * FROM @mytable WHERE ID=@Val1)
INSERT INTO @mytable VALUES(@VAL2)
END
Run Code Online (Sandbox Code Playgroud)
我使用ExecuteNonQuery()使用C#在ASP.NET中调用此存储过程.它工作正常,没有问题,如果它们不存在,它会插入值.问题是cmd.ExecuteNonQuery()始终返回-1.我希望如果插入一条记录,它应该返回1,如果不是,则返回0,对吗?
我知道这不是一个有用的问题的地狱,但我不禁被它所困扰.
那么,
为什么所说的方法(在*Command类中)被称为
ExecuteNonQuery而不是ExecuteQuery?
这些SQL语句不是我们在DBs,查询中抛出的吗?
我创建了一个简单的程序来将值插入表中[regist],但我不断收到错误
')附近的语法不正确
上cmd.ExecuteNonQuery();:
private void button1_Click(object sender, EventArgs e)
{
SqlConnection cn = new SqlConnection("Data Source=DELL-PC;initial catalog=AdventureWorks2008R2 ; User ID=sa;Password=sqlpass;Integrated Security=SSPI;");
SqlCommand cmd = new SqlCommand("INSERT INTO dbo.regist (" + " FirstName, Lastname, Username, Password, Age, Gender,Contact, " + ") VALUES (" + " @textBox1.Text, @textBox2.Text, @textBox3.Text, @textBox4.Text, @comboBox1.Text,@comboBox2.Text,@textBox7.Text" + ")", cn);
cn.Open();
cmd.ExecuteNonQuery();
cn.Close();
}
Run Code Online (Sandbox Code Playgroud)
我是新手,我真的很困惑.
我之前使用过这种方法来返回更改的行数.我是运行insert方法,插入在存储过程中运行正常,但ExecuteNonQuery的返回值始终返回-1.
这是我的C#代码:
int ret = 0;
using (SqlConnection conn = new SqlConnection(this.ConnectionString))
{
using (SqlCommand cmd = new SqlCommand(QueryName, conn))
{
conn.Open();
if (Params != null)
cmd.Parameters.AddRange(Params);
cmd.CommandType = CommandType.StoredProcedure;
ret = cmd.ExecuteNonQuery();
conn.Close();
}
}
return ret;
Run Code Online (Sandbox Code Playgroud)
为什么我得到-1而不是更改的实际行数?
简单的问题,是否可以在更新一个实体时使用Entity Framework实现此查询?
update test set value = value + 1 where id = 10
Run Code Online (Sandbox Code Playgroud) 我有以下一些运行SQL语句的代码:
int rowsEffected = 0;
using (SqlConnection dbConnection = new SqlConnection(dbConnectionString))
{
try
{
dbConnection.InfoMessage += new SqlInfoMessageEventHandler(dbConnection_InfoMessage);
dbConnection.FireInfoMessageEventOnUserErrors = true;
dbConnection.Open();
SqlCommand command = dbConnection.CreateCommand();
command.CommandTimeout = 0;
command.CommandText = sqlStatement;
rowsEffected = command.ExecuteNonQuery();
}
catch (Exception e)
{
// Handle exception
}
}
Run Code Online (Sandbox Code Playgroud)
长时间运行的SQL语句可以通过使用具有适当严重性值的RAISERROR引发错误来报告SqlInfoMessageEventHandler的进度.
将FireInfoMessageEventOnUserErrors设置为true的原因是,如果没有这个,只有ExecuteNonQuery()返回时,才会立即处理来自SQL语句的所有消息.将此值设置为true,将在SQL语句引发进度消息时对其进行处理.
正如属性的名称所暗示的那样,事件处理程序还会触发错误,而不仅仅是针对SQL语句的进度反馈保留的特定严重性级别.
进度反馈的事件处理程序如下所示:
public void dbConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
if (e.Errors.Count > 0)
{
throw new Exception("Something bad happened");
}
// Report progress
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我可以检测到'e'中属性发生错误的时间,但抛出异常并没有做任何事情.我希望执行会落入catch块,但事实并非如此.
如何在ExcecuteNonQuery()方法之后确定发生错误?
TIA
我正在尝试使用事务运行 ExecuteNonQuery,但我不断收到此错误
OleDbException:当分配给命令的连接处于挂起的本地事务中时,ExecuteNonQuery 要求该命令具有事务。命令的 Transaction 属性尚未初始化。
这是我的代码:有什么问题吗?
_dataManager = new DataManager();
bool bTrance = false;
_dataManager.BuildConnectionString("server", "MyId", "MyPwd");
_dataManager.Connect();
try
{
Console.WriteLine("Begin Trans");
var res = _dataManager.BeginTransaction();
if (res)
{
bTrance = true;
Console.WriteLine(" Trans Success");
}
Console.WriteLine("Query Executed");
return _dataManager.ExecuteQuery("call SP_MySp");
}
catch (OleDbException objDBExc)
{
Console.WriteLine("OleDbException : " + objDBExc.Message);
if (bTrance)
{
_dataManager.RollbackTransaction();
}
return false;
}
catch (Exception objExc)
{
Console.WriteLine("OleDbException : " + objExc.Message);
if (bTrance)
{
bTrance = false;
_dataManager.RollbackTransaction();
}
return false;
} …Run Code Online (Sandbox Code Playgroud) 我ExecuteNonQuery用来运行插入proc,它返回2,但实际上我只插入1条记录.由于触发,我得到1个额外的.无论如何我只得到实际受影响的行数.我不希望受触发器影响的行.
executenonquery ×10
c# ×8
sql ×3
sql-server ×3
.net ×2
ado.net ×2
asp.net ×1
c#-4.0 ×1
dbcommand ×1
mysql ×1
oledbcommand ×1
sqlcommand ×1
transactions ×1