Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# tocol,InfoMessage位于select语句前面的结果之后,在使用之前不可用。Jacob:不,这与DataTables和/或DataAdapter无关。如果有什么区别的话,使用带有Fill方法的DataTable的人可能会更快地获得消息,但这只是_C#_Sql Server_Stored Procedures_Resultset - Fatal编程技术网

C# tocol,InfoMessage位于select语句前面的结果之后,在使用之前不可用。Jacob:不,这与DataTables和/或DataAdapter无关。如果有什么区别的话,使用带有Fill方法的DataTable的人可能会更快地获得消息,但这只是

C# tocol,InfoMessage位于select语句前面的结果之后,在使用之前不可用。Jacob:不,这与DataTables和/或DataAdapter无关。如果有什么区别的话,使用带有Fill方法的DataTable的人可能会更快地获得消息,但这只是,c#,sql-server,stored-procedures,resultset,C#,Sql Server,Stored Procedures,Resultset,tocol,InfoMessage位于select语句前面的结果之后,在使用之前不可用。Jacob:不,这与DataTables和/或DataAdapter无关。如果有什么区别的话,使用带有Fill方法的DataTable的人可能会更快地获得消息,但这只是因为Fill方法在进入下一行代码之前完全在读取器中移动。最后,你不需要我在回答中显示的信息。您只需要reader.HasRows()。这既复杂又不必要。请(每个人)阅读OP在问题中发布的代码,而不仅仅是问题的标题。虽然OP要求捕获消息,但这并不


tocol,InfoMessage位于select语句前面的结果之后,在使用之前不可用。Jacob:不,这与DataTables和/或DataAdapter无关。如果有什么区别的话,使用带有
Fill
方法的DataTable的人可能会更快地获得消息,但这只是因为Fill方法在进入下一行代码之前完全在读取器中移动。最后,你不需要我在回答中显示的信息。您只需要
reader.HasRows()
。这既复杂又不必要。请(每个人)阅读OP在问题中发布的代码,而不仅仅是问题的标题。虽然OP要求捕获消息,但这并不是OP最终真正想要实现的目标。如果捕获消息确实是这里的目标,那么这仍然没有帮助,
输出
参数是一条消息,其他结果集很笨拙,可能会在各种情况下对进程的运行产生不利影响,例如尝试将结果集捕获到临时表中,等等@srutzky:请让我们知道你的理解。。。并提供更好的解决方案。此外,OP已经正确处理了使用
ExecuteOnQuery
的场景,并在问题中说明它可以正常工作。@srutzky:这只是代码示例。我从来没有提到过它可以在任何地方使用。我已经按照你在我回答这个问题时的要求做了。重申:OP只是在寻找是否存在结果集的指示,甚至从不使用消息的文本。这是一种糟糕的测试方法,因为SqlDataReader通过boolean
HasRows
属性提供答案。
IF EXISTS
(
    SELECT MFG_PART_NUMBER, COUNT(*) AS RecordCount
    FROM [PartsManagement].[ManufacturerCatalogPart] 
    WHERE CatalogID = @CatalogID
    GROUP BY MFG_PART_NUMBER
    HAVING COUNT(*) > 1
)
    BEGIN

    SELECT MFG_PART_NUMBER, COUNT(*) AS RecordCount
    FROM [PartsManagement].[ManufacturerCatalogPart] 
    WHERE CatalogID = @CatalogID
    GROUP BY MFG_PART_NUMBER
    HAVING COUNT(*) > 1;

    PRINT 'The update was not executed because duplicate MFG_PART_NUMBERs were found in the catalog. Delete the duplicates and try again.';

END;
//field
private string sqlPrintMessage = "";

//event handler for sql PRINT message
void myConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    sqlPrintMessage = e.Message;
}

public void SomeMethod()
{
    using (SqlConnection sqlcon = new SqlConnection(ConnectionManager.GetConnectionString()))
    {
        sqlcon.InfoMessage += new SqlInfoMessageEventHandler(myConnection_InfoMessage);

        SqlCommand sqlcmd = new SqlCommand("[ManufacturerCatalogUpdate].[CheckCatalogForDuplicates]", sqlcon);
        sqlcmd.CommandType = CommandType.StoredProcedure;
        sqlcmd.Parameters.AddWithValue("@CatalogID", catalogID);
        sqlcon.Open();
        //SqlDataReader reader = sqlcmd.ExecuteReader();
        sqlcmd.ExecuteNonQuery();
        if (sqlPrintMessage == "") //then proceed with update
        {
            //do some logic
        }
        else
        {
            //System.Diagnostics.Debug.WriteLine(sqlPrintMessage);
            //List<DuplicatePartCount> duplicateParts = new List<DuplicatePartCount>();
            //while (reader.Read())
            //{
            //    DuplicatePartCount record = new DuplicatePartCount();
            //    record.MFG_PART_NUMBER = reader.GetString(0);
            //    record.count = reader.GetInt32(1);
            //    duplicateParts.Add(record);
            //}
        }
    }
}
CREATE PROCEDURE GetEmployee
   @employeeID INT,
   @Message VarChar(100) OUTPUT
AS
BEGIN
   -- Here is your result set from select statement
   SELECT Emp_Name From Employee Where EmpId = @employeeID 

   -- Here is your message
   SELECT @Message = 'Your Message!'
END
//Add the output parameter to the command object
SqlParameter outPutParameter = new SqlParameter();
outPutParameter.ParameterName = “@Message”;
outPutParameter.SqlDbType = System.Data.SqlDbType.Varchar;
outPutParameter.Direction = System.Data.ParameterDirection.Output;
cmd.Parameters.Add(outPutParameter);

cmd.ExecuteNonQuery();

//Retrieve the value of the output parameter
string Message = outPutParameter.Value.ToString();

// You can get remaining result set as always
 SELECT Emp_Name From Employee Where EmpId = @employeeID 
  -- It should be set previously
  SELECT @Message
using (SqlDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                //Your result set or message
            }

            if(reader.NextResult())
            {
               while (reader.Read())
              {
                 //Your result set or message
              }
            }
        }