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通过booleanHasRows
属性提供答案。
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
}
}
}