簡體   English   中英

在 C# 中使用存儲過程輸出參數獲取列值

[英]Get column values using stored procedure output parameters in C#

我有一個包含 3 列的 SQL 表:ID (bigint)、Tag1 (int)、DateTime (datetime)。 我制作了一個存儲過程,它從我的表中選擇從 DataStart 到 DataStop 的 Tag1 的值。 它工作正常。 編碼:

ALTER PROCEDURE [dbo].[PS_TagLogging]
 -- Add the parameters for the stored procedure here
 @Col varchar(30) Output, 
 @DataStart varchar(50) ,
 @DataStop  varchar(50) 

AS
BEGIN

 SET NOCOUNT ON;
 DECLARE @sql nvarchar(1000)

  SET @sql = N'SELECT ' + @Col + ', DateTime ' + 'FROM [TRTF_TagLogging].[dbo].[tbl_TagLogging] WHERE (DateTime BETWEEN ' +''''+ @DataStart +'''' + ' AND '  +''''+ @DataStop+'''' +')'
   exec (@sql)
   PRINT @sql
END

execute [PS_TagLogging] '[Tag1]', '2020-02-05 13:06:30.697','2020-02-05 13:06:50.700'

存儲過程的執行正確返回 5 個值。

我想在 C# 中獲得這 5 個值。 我試過的:

private void DB_ProcStoc_Click(object sender, EventArgs e)
        {
            using (SqlConnection connection = new SqlConnection(@"Data Source=DESKTOP-JQSJAF8\SQLEXPRESS;Initial Catalog=TRTF_TagLogging;Integrated Security=True"))
            {
                using (SqlCommand cmd = new SqlCommand("PS_TagLogging", connection))
                {
                    connection.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.Add("@Col", SqlDbType.VarChar, 30).Direction = ParameterDirection.Output;
                    cmd.Parameters.Add("@DataStart", SqlDbType.VarChar, 30).Value = "2020-02-05 13:06:30.697";
                    cmd.Parameters.Add("@DataStop", SqlDbType.VarChar, 30).Value = "2020-02-05 13:06:50.700";

                    cmd.ExecuteNonQuery();

                    strCol = Convert.ToString(cmd.Parameters["@Col"].Value); //strCol is a string globally declared
                    connection.Close();
                }
            }
            MessageBox.Show("Proc: " + strCol + " values");            
        }

按下按鈕時沒有出現錯誤,但 MessageBox 中沒有顯示任何值。 我不確定是否應該使用 @Col 參數作為輸出。 我應該怎么做才能獲得這些值?

如果有人和我有同樣的問題,它是這樣解決的:

我的存儲過程:

ALTER PROCEDURE [dbo].[PS_TagLogging]
 -- Add the parameters for the stored procedure here
 @DataStart datetime=null,
 @DataStop  datetime=null

AS
BEGIN
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;    

    -- Insert statements for procedure here
SELECT [ID]
      ,[Tag1]      
      ,[DateTime]
  FROM [TRTF_TagLogging].[dbo].[tbl_TagLogging]
  WHERE DateTime between @DataStart and @DataStop 
END

在 C# 中,在按鈕單擊操作中:

private void DB_ProcStoc_Click(object sender, EventArgs e)
        {
            using (SqlConnection connection = new SqlConnection(@"Data Source=DESKTOP-JQSJAF8\SQLEXPRESS;Initial Catalog=TRTF_TagLogging;Integrated Security=True"))
            {
                using (SqlCommand cmd = new SqlCommand("PS_TagLogging", connection))
                {
                    connection.Open();
                    cmd.CommandType = CommandType.StoredProcedure;                  
                    cmd.Parameters.Add("@DataStart", SqlDbType.DateTime).Value = new DateTime(2020, 02, 05, 13, 06, 30, 697);
                    cmd.Parameters.Add("@DataStop", SqlDbType.DateTime).Value = new DateTime(2020, 02, 05, 13, 12, 25, 703);//2020, 02, 05, 13, 12, 25, 703   //2020, 02, 05, 13, 06, 50, 700

                    var values = new List<int>();
                    var valData = new List<DateTime>();
                    SqlDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        values.Add(reader.GetInt64(0));//reads the value of my first column (ID) from DB
                        values.Add(reader.GetInt32(1));//reads the value of my second column (Tag1) from DB
                        valData.Add(reader.GetDateTime(2));//reads the date from my third column of DB
                    }

                    strCol = String.Join(" ", values);
                    strDate = String.Join(" ", valData);


                    connection.Close();
                }
            }
            //MessageBox.Show("Proc: " + strCol + " values");
            MessageBox.Show("Date: "+ strDate);            
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM