我目前正在开发一个C#项目,我正在运行一个插入查询,它也同时进行选择,例如:
INSERT INTO table (SELECT * FROM table WHERE column=date)
有没有办法可以看到在此查询期间插入了多少行?
试图弄清楚它是否最好使用,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;
        }
    }
}
这对我需要的东西很好,所以我很想知道
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
我使用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();
}
我是新手,我真的很困惑.
我之前使用过这种方法来返回更改的行数.我是运行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;
为什么我得到-1而不是更改的实际行数?
简单的问题,是否可以在更新一个实体时使用Entity Framework实现此查询?
update test set value = value + 1 where id = 10
我有以下一些运行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
    }
}
长时间运行的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
}
正如您所看到的,我可以检测到'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;
        } …我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