数据总是返回第二个值

时间:2014-10-22 06:51:54

标签: c# sql tsql datatable

我发现了一些我尚未找到解决方案的奇怪行为。当我调试SQL代码时,它返回正确的值,但不知何故,在C#代码中,datatable返回错误的结果。

由于这是计费应用程序而且它有敏感信息,我无法发布整个代码,只有包含有问题代码的方法和返回结果的SQL存储过程。

SQL:

ALTER PROCEDURE [dbo].[conf_SetRationCurrency] 
-- Add the parameters for the stored procedure here

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

-- Insert statements for procedure here
DECLARE @Date AS VARCHAR(10),
      @Today AS VARCHAR(10)

SELECT @Date = CONVERT(VARCHAR(10),[date], 112) FROM RatioCurrency
SELECT @Today = CONVERT(VARCHAR(10),GETDATE(),112)

BEGIN TRAN
BEGIN TRY
   IF @Date <> @Today
   BEGIN
      -- INSERT
      INSERT INTO dbo.RatioCurrency 
      SELECT rateType, CAST(CONVERT(VARCHAR, GETDATE(), 112) AS SMALLDATETIME) AS [date],fromCurrency,toCurrency,value 
      FROM dbo.RatioCurrency where [date] = 
      (
      SELECT TOP 1 CAST(CONVERT(VARCHAR, [date], 112) AS SMALLDATETIME) AS [date] 
      FROM dbo.RatioCurrency 
      ORDER BY ID DESC
      )       
      SELECT 'Yes' AS 'INSERTED' -- return flag for setting output text in code
   END
   ELSE
   BEGIN
      SELECT 'No' AS 'NOT' -- return flag for setting output text in code 
   END
END TRY
BEGIN CATCH
   IF @@TRANCOUNT > 0
      ROLLBACK TRAN
      EXEC dbo.intf_ShowError
      RETURN
END CATCH
COMMIT
END

C#:

     DialogResult dialog = MessageBox.Show("Da li želite kopirati valutu zadnjeg unosa za današnji dan...?","Upit",MessageBoxButtons.YesNo, MessageBoxIcon.Question);
        if (dialog == DialogResult.Yes)
        {
            DataTable dt = Program.ExecProc("conf_SetRationCurrency");

            if (dt.Rows.Count > 0 && dt.Columns[0].ColumnName == "ErrorNumber")
            {
                Program.ShowDataInfoError(dt.Rows[0]); //print error message
            }
            else if (dt.Rows.Count > 0 && dt.Columns[0].ColumnName == "NOT") //part which should only give info that value is already in the database, no need to insert new one. 
            {
                SplashForm sf = new SplashForm();
                sf.informationText.Text = "Valuta već postoji.";
                sf.Show();
                GetCurrency();
                this.Refresh();
            }
            else // this part actually gives info that new values are inserted
            {
                SplashForm sf = new SplashForm();
                sf.informationText.Text = "Valuta je upisana.";
                sf.Show();
                GetCurrency();
                this.Refresh();
            }
        }
        else
        {
            return;
        }

即使SQL返回正确的列名值,datatable也会返回列名 - “NOT”(第二个),我的意思是总是......这不可能是真的,因为我有if / else语句和程序应该避免第二个statemement。如何将数据表对象保存错误的列名?这是一个错误还是因为我正在使用列的别名所以它使用最后一个...?有人有答案吗?

2 个答案:

答案 0 :(得分:1)

曾经遇到同样的问题,但不是在C#中:

原因是通过php访问查询结果指针已全部移动,因此始终跳过第一个结果。

听起来像是同一类问题,可能是行数。

(抱歉不能发表评论)

答案 1 :(得分:1)

ADO.NET正在缓存从存储过程返回的DataTable结构(列名和类型)。基于业务逻辑更改表结构并不是一个好主意 - 而是改变数据而不是结构。 我建议你更改sp,以便它总是返回相同的列名,例如&#34;状态&#34;但会根据您的业务逻辑而变化。

--SQL logic
if (errorCondition)
  SELECT 'ERROR' as Status, 'Error message' as Message
if @Date <> @Today
   SELECT 'Yes' AS Status, '' AS Message
else
   SELECT 'No' AS Status, '' as Message

然后你的C#逻辑变得更简单了:

  • 始终返回一行数据,其中包含固定数量的列且具有固定名称
  • 您可以在为业务逻辑返回的单行中使用