1

私のコードでは、Visual Studio C# を使用してデバッグすると、クエリに行がないことに気付きました:

select MAX(idSalesJournal) as maxId from accountingsystemdb.salesjournal" 

dr.HasRows プロパティは常に TRUE を返します。デバッグを続けると、ループを終了する前にループが 1 回実行されることに気付きました。データセットにはデータがありませんが、ループが 1 回実行されるため、大きな問題があります。次に、取得した値をメッセージボックスに出力しましたが、何も表示されません (空白)。どうすればこれが起こり、どうすればこのことを回避できますか? 正常に実行され、結果に行が表示されなかった mySql ワークベンチで実行したのと同じクエリの画像を配置します。MySqlで0行を示しています。C# で実行された同じクエリは、Hasrows プロパティを True として返します。完全なコードを以下に示します。

    public void salesJournal(string addOrRemove, string lorryNo, string invoiceNo, DateTime billDate, string source, DateTime paybackDate, string itemCode, double itemcost, string desc, double qty, double discount, double amount, string debtor)
    {

        if (conn.State.ToString() == "Open")
        {
            conn.Close();
            conn.Open();
        }

        int maxID = 0;

        if (conn.State.ToString() == "Closed")
        {
            conn.Open();
            MySqlCommand cmd = conn.CreateCommand();
            cmd.Connection = conn;
            cmd.CommandType = CommandType.Text;

            //---------------------- Selecting Max ID ------------------------------------------
            cmd.CommandText = "select MAX(idSalesJournal) as maxId from accountingsystemdb.salesjournal";

            try
            {
                MySqlDataReader dr = cmd.ExecuteReader();

                if (dr.HasRows && dr != null)
                {

                    while (dr.Read())
                    {                            

                        maxID = Convert.ToInt32(dr["maxId"].ToString());

                    }
                }
                else
                {
                    maxID = 0;
                }
            }
            catch(Exception e)
            {
                MessageBox.Show(e.ToString());
            }

            conn.Close();
            //---------------------------------------------------------------------------------


            if (conn.State.ToString() == "Open")
            {
                conn.Close();
                conn.Open();
            }
            else
            {
                conn.Open();
            }

            try
            {
                cmd.CommandText = "insert into accountingsystemdb.salesjournal VALUES('" + maxID + 1 + "', STR_TO_DATE('" + billDate + "', '%m/%d/%Y %h:%i:%s %p'), '" + invoiceNo + "', '" + lorryNo + "', '" + source + "', '" + itemCode + "', '" + desc + "', '" + qty + "', '" + itemcost + "', '" + amount + "', '" + discount + "', '" + addOrRemove + "', STR_TO_DATE('" + paybackDate + "', '%m/%d/%Y %h:%i:%s %p'), '" + debtor + "', '" + Program.username + "')";
                cmd.ExecuteNonQuery();
            }
            catch(Exception e)
            {
                MessageBox.Show(e.ToString());
            }

            conn.Close();

        }


    }
4

4 に答える 4

0

はい。これは、何もない場合、SQL SERVERでセル値が null になるためです。したがって、テキスト"NULL"は SQLServer で返される結果です。

dr.read()リーダーが HasRowsかどうかを確認するために使用することをお勧めします

if(dr.read())  
{
 // code logic for HasRows
}
else
{
// if nothing is there
}

于 2015-05-20T12:12:06.350 に答える
0

MySql データベースへのクエリは、2 つの結果セットを返すことができます。最初の結果セット (別名テーブル) は返された/影響を受けた行の数で、2 番目は実際のクエリの結果です。

したがって、実際のクエリから返された行数を含む 1 行を含む最初の結果セットを読み取っているため、HasRows を true に設定することは正確です。

dr.NextResult() を呼び出して、実際のクエリ結果を取得します。

于 2015-05-20T12:24:59.427 に答える