none
C# 取得完整SQL 問題 RRS feed

  • 問題

  • 小弟最近處理一段從DB取得資料時,在撰寫SQL時為了配合公司源碼掃描,做了下面的改寫

    程式碼:

     using (SqlConnection sqlConnection = new SqlConnection(Validator.Validate(connectionString)))
     {
            try
            {
                 sqlConnection.Open();

                string sqlstr = "select top 10 * from testtable where testfield = @condition"

                 using (SqlCommand command = new SqlCommand(
                             @"
                                DECLARE @RESULT CHAR(1); 
                                DECLARE @SQL NVARCHAR(MAX); 
                                BEGIN TRANSACTION 
                                BEGIN TRY 
                                SET @SQL = @sqlstr
                                EXEC('@SQL')
                                SET @RESULT  = 'Y' 
                                COMMIT; 
                                END TRY 
                                BEGIN CATCH 
                                SET @RESULT = 'N';
                                ROLLBACK TRANSACTION; 
                                END CATCH; 
                                SELECT @RESULT AS RESULT;
                                "
                            , sqlConnection))
                        {

                            command.Parameters.Add(new SqlParameter("@sqlstr", sqlstr.ToString()));

                            command.Parameters.Add(new SqlParameter("@condition", "AA"));

                             SqlDataReader reader = command.ExecuteReader();
                            if (reader.HasRows)//檢查是否有資料列
                            {
                                while (reader.Read())//嘗試讀取一筆資料列,並且回傳是否成功
                                {
                                    _result = reader["RESULT"].ToString();
                                }
                            }
                            reader.Close(); //關閉 DataReader

                        }

            }

    }

    但在執行時,結果一直是N ,想請問各位前輩,是否有方法讀到代入參數後的完整SQL
    (以此題為例是 select top 10 * from testtable where testfield = 'AA')

    2021年2月5日 上午 07:26

所有回覆

  • 您可以這樣做:

    string query = cmd.CommandText;
    
    foreach (SqlParameter para in cmd.Parameters)
    {
      query = query.Replace(p.ParameterName, para.Value.ToString());
    }
    再用偵錯工具檢視query變數的內容值, 或是用Console.WriteLine協助檢示

    2021年2月5日 上午 08:23