【问题标题】:SQL Script Component c# select statement only read onceSQL Script Component c# select 语句只读取一次
【发布时间】:2014-08-26 15:11:47
【问题描述】:

我有一个问题:我与另一个数据库 (dwh_fct_overgangen) 建立了成功连接,并且我正在使用 select 命令从另一个数据库中检索最大值。这对于第一行运行得非常好。但是,在选择第二行(其中包含与第一行不同的值)后,它不再从其他数据库中选择最大值。

会不会是参数第一次得到一个特定的值,而这个值在处理新行时永远不会改变?

还是说SQL命令只执行一次?

谁能解释我做错了什么

public override void AcquireConnections(object Transaction)
{
    base.AcquireConnections(Transaction);
    connMgr = this.Connections.ConnectionDWH;
    conn = (SqlConnection)connMgr.AcquireConnection(null);
}

public override void PreExecute()
{
    base.PreExecute();
}


int volgnrteller = 0;
int materieelbuffer = 0;
int matcheck = 0;
string locatiebuffer = "";


public override void Input0_ProcessInputRow(Input0Buffer Row)
{

    cmd = new SqlCommand("select max(volgnr) from dwh_dz.fct_Overgangen where dwh_dz.fct_Overgangen.Mat_nr= @matcheck)", conn);
    SqlParam = new SqlParameter("@matcheck", SqlDbType.Int, 4);
    SqlParam.Direction = ParameterDirection.InputOutput;
    cmd.Parameters.Add(SqlParam);


        if (materieelbuffer != Row.Matnr)
        {
            volgnrteller = 0;
            try
            {          
                cmd.Parameters["@matcheck"].Value = Row.Matnr;
                sqlReader = cmd.ExecuteReader(); 
                sqlReader.Read();
                volgnrteller = sqlReader.GetInt32(0);
                sqlReader.Close();
                materieelbuffer = Row.Matnr;
             }
            catch (Exception e)   
            {
                Output0Buffer.AddRow();
                volgnrteller++;
                materieelbuffer = Row.Matnr;
            }

        }
        else if (locatiebuffer != Row.Locatie)
        {

            volgnrteller++;
            Output0Buffer.Tijduit = Row.TIJD;
            Output0Buffer.AddRow();
            in_tijdbuffer = Row.TIJD;
            locatiebuffer = Row.Locatie;
          }

}

【问题讨论】:

  • 您应该首先检查您的返回值。你打电话给Read(),但从不检查是否成功。如果你想获得一个标量值,也许ExecuteScalar 会比一个成熟的阅读器更容易。
  • 我只能说你这里有太多的全局变量在起作用。在这些情况下,他们每个人都可能使您的代码朝着错误的方向发展。这里最好的选择是启动调试器并检查代码流和变量的值

标签: c# sql select query-parameters


【解决方案1】:

不确定我是否只是没有看到它,但看起来这个方法“Input0_ProcessInputRow”不会被多次执行。我看不到 while 语句,或者它像你描述的那样被执行了两次。

您是否尝试在数据集中选择多行,因为 SqlDataReader.GetInt32(0) 只会为您提供第一列结果。

读者也应该在一个while循环中,像这样。

reader = cmd.ExecuteReader();
while(reader.Read())   
{
    Q = int.Parse(reader["YourColumnName"]);
    txtbx.Text = reader["YourColumnName"].ToString(); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多