C# Datatable始终返回第二个值

C# Datatable始终返回第二个值,c#,sql,tsql,datatable,C#,Sql,Tsql,Datatable,我发现了一些奇怪的行为,我还没有找到解决办法。调试SQL代码时,它返回正确的值,但在C代码中,datatable返回错误的结果 由于这是一个计费应用程序,并且它有敏感信息,所以我不能发布整个代码,这是唯一包含有问题代码的方法和返回结果的SQL存储过程 SQL: 即使SQL返回了正确的列名称值,datatable也返回了列名-不是第二个,我的意思是总是。。。这不可能是真的,因为我有if/else语句和程序应该避免第二种状态。datatable对象怎么会有错误的列名?这是一个bug还是因为我对列使用

我发现了一些奇怪的行为,我还没有找到解决办法。调试SQL代码时,它返回正确的值,但在C代码中,datatable返回错误的结果

由于这是一个计费应用程序,并且它有敏感信息,所以我不能发布整个代码,这是唯一包含有问题代码的方法和返回结果的SQL存储过程

SQL:


即使SQL返回了正确的列名称值,datatable也返回了列名-不是第二个,我的意思是总是。。。这不可能是真的,因为我有if/else语句和程序应该避免第二种状态。datatable对象怎么会有错误的列名?这是一个bug还是因为我对列使用别名,所以它使用最后一个。。。?有人有答案吗?

曾经有过同样的问题,虽然不是C:

原因是,通过php访问查询结果,指针被allready移动,因此第一个结果总是被跳过

听起来像是同样的问题,可能是行数


很抱歉,不能仅发表评论。ADO.NET正在缓存从存储过程返回的DataTable结构列名和类型。根据业务逻辑更改表结构不是一个好主意,而是更改数据而不是结构。 我建议您更改sp,使其始终返回相同的列名,例如Status,但值会根据您的业务逻辑而变化

--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逻辑变得更简单,因为:

始终有一行返回的数据具有固定的列数和固定的名称 您可以使用为业务逻辑返回的单行中的值
我确实玩过代码,但结果是一样的,比如选择@val='Yes'。。。否则开始选择@val='No'结束。。。选择@val作为TEMP和C:`dt.Columns[0]。ColumnName==TEMP`where dt.Rows[0][0]。ToString.EqualsYes,仍然没有解决方案。。。看起来用户:evlive是对的。这与跳过第一个值的指针有关抱歉,我拼错了昵称-它是:@evilive如果您可以看到DataTable只包含一行,并且您可以从该行检索值,那么就没有跳过的指针。您正在使用绝对索引访问行[0],因此不涉及指针。好的,我认为问题在于您的第一个语句SELECT@Date=CONVERTVARCHAR10,[Date],112 FROM RatioCurrency,它将始终从表的第一行检索日期。只有RatioCurrency只包含一行时,它才会起作用,但在SP中,您正在添加行,这就是您的问题所在。我只需要一行即可与当前日期进行比较。问题是,如果插入不是自动完成的,您可以手动执行,因此首先它会检查我更正为的最后一天:根据id DESC从RatioCurrency ORDER中选择TOP 1@Date=CONVERTVARCHAR10,[Date],112并将其与当前日期进行比较。如果它与应该发生的insert不同,但如果不是,则跳过并只发送c代码的标志…好吧,我不能说这与rowcount有关,因为在visual studio中,当我将DataTable对象设置为Add以查看其属性时,我可以看到rowcount为1,所以它具有值。。。
     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 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