8

我想打印 SQL Server 返回的值。

If NOT Exists(SELECT * FROM ItemList WHERE ItemName='txtItemNama') 
   BEGIN   
    INSERT INTO ItemList (ItemName) VALUES('txtItemNamea')  
   END 
ELSE  
   BEGIN 
    Print 'Duplicate' 
   END

此查询将返回我受影响的行数或重复

我想在 C# 中使用这个 DuplicateMessageBox.Show()

string query1 = "If NOT Exists(SELECT * FROM ItemList WHERE ItemName='txtItemName') BEGIN  INSERT INTO ItemList (ItemName) VALUES('txtItemName')  END ELSE  BEGIN Print 'Duplicate' END";
            SqlCommand cmd = new SqlCommand(query1, conn);
            SqlDataReader dr;
            conn.Open();
            dr=cmd.ExecuteReader();
            conn.Close();
MessageBox.Show(dr);

我不知道如何使用dr来做到这一点。请帮我在这里打印重复

MessageBox.Show(博士);

我需要在这里做什么?

4

2 回答 2

7

晚了几年,但您应该能够通过将事件处理程序附加到SqlConnection 对象上的InfoMessage 事件来检索打印/信息文本(如最初要求的那样) -

但只有在您不能(出于某种原因)使用此线程中提到的替代方案时才这样做。

static void Main(string[] args)
{
    using (SqlConnection connection = new SqlConnection(@"someconnectionstring"))
    {
        connection.Open();
        using(SqlCommand command = new SqlCommand("test", connection))
        {
            connection.InfoMessage += new SqlInfoMessageEventHandler(connection_InfoMessage);
            using (SqlDataAdapter adapter = new SqlDataAdapter(command))
            {
                DataTable dt = new DataTable();
                adapter.Fill(dt); // Do something with DataTable
            }
        }
    }
}

static void connection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    // e contains info message etc
}
于 2012-02-01T08:49:35.650 回答
1

使用 ADO.NET,有四个选项可用于从 SQL 查询返回信息:

  • 除了返回值和返回参数之外,使用 DataSet 对象收集返回的行并使用这些行。
  • 使用 DataReader 对象收集返回的行、在这些行中移动以及收集返回值和返回参数。
  • 使用 ExecuteScalar 方法从结果的第一行的第一列返回值以及返回值和返回参数。这对于聚合函数最有用。
  • 使用 ExecuteNonQuery 方法只返回返回参数和返回值。任何返回的行都将被丢弃。这对于执行操作查询最有用。

这些都是从您的命令对象调用的方法。

给猫换皮有很多不同的方法,可以使用输出参数,可以使用 ExecuteScalar,可以使用返回值,也可以使用虚拟记录集。

您应该能够在您的 C# 中执行以下操作以从查询中获取返回值

// add a new parameter, with any name we want - its for our own use only 
SqlParameter sqlParam = com.Parameters.Add("@ReturnValue", SqlDbType.Int); 
// set the direction flag so that it will be filled with the return value 
myParm.Direction = ParameterDirection.ReturnValue;

上面的代码捕获了您可以根据需要设置的返回值,可能用 0 表示存在,用 1 表示不存在。

If NOT Exists(SELECT * FROM ItemList WHERE ItemName='txtItemNama')    
   BEGIN      
    INSERT INTO ItemList (ItemName) VALUES('txtItemNamea') 
    Return 0;    
   END    
ELSE     
   BEGIN    
    Return 1;    
   END 

然而,上述建议有一点需要注意——我通常要么使用像 Linq-to-SQL 或 NHibernate 这样的 ORM,要么使用存储过程。我发现内联 SQL 相当麻烦。因此,虽然我的回答总体上应该是合理的,但您可能需要处理一些细节才能使其完全按照您的需要工作。

于 2010-01-08T12:30:27.097 回答