3

次のコードを書きました。別のクエリを実行したいクエリに対して、データベース接続を 1 回開いています。以下のコードを書きました。しかし、私は間違いがあると思います 誰か助けてもらえますか?

public void check()
{
    try
    {
        OdbcConnection myOdbcConnection = new OdbcConnection(con1);
        OdbcCommand myOdbcCommand = myOdbcConnection.CreateCommand();
        String sSQL = "SELECT * FROM(select tdate from tbl_IThelpdesk order by call_no desc)where ROWNUM = 1"; //last record of the call_no column
        myOdbcCommand.CommandText = sSQL;
        myOdbcConnection.Open();
        OdbcDataReader myOdbcDataReader = myOdbcCommand.ExecuteReader();
        if (!myOdbcDataReader.Read())
        {
            txtDate.Text = DateTime.Now.ToShortDateString();
            string strcallno = DateTime.Now.Year.ToString("d2") + DateTime.Now.Month.ToString("d2") + DateTime.Now.Day.ToString("d2");
            txtcall.Text = "ITHD" + strcallno + "001";
            myOdbcConnection.Close();
            myOdbcDataReader.Close();
        }
        else
        {
            DateTime today = DateTime.Parse(DateTime.Now.ToShortDateString());
            if (myOdbcDataReader[0].ToString() == today.ToString())
            {
                myOdbcConnection.Close();
                myOdbcDataReader.Close();
                myOdbcConnection.Open();
                OdbcCommand myOdbcCommand1 = myOdbcConnection.CreateCommand();
                String SQLmax = "SELECT max(call_no) FROM TBL_IThelpdesk";
                myOdbcCommand1.CommandText = SQLmax;

                OdbcDataReader myOdbcDataReader1 = myOdbcCommand1.ExecuteReader();
                while (myOdbcDataReader1.Read() != false)
                {
                    txtcall.Text = myOdbcDataReader1[0].ToString().Trim();
                }
                myOdbcDataReader1.Close();
                myOdbcDataReader.Close();
                myOdbcConnection.Close(); 
            }
        }
    }
    catch (Exception e)
    {
        lblEmpty.Text = e.Message;
        lblEmpty.Visible = true;
    }
}
4

2 に答える 2

11

データベース接続はプールを使用するため、複数のクエリに対して同じ接続を維持する必要はありません。代わりに、必要なときに接続を開き、できるだけ早く接続を閉じてリソースを解放します。

参照:http
://msdn.microsoft.com/en-us/library/8xx3tyca(v = vs.80).aspx 参照:C#SQLConnectionプーリング

using() { }パターンを使用していないことに注意してください。とOdbcConnection同様のタイプが実装されている場合、ガベージコレクタを待たずに破棄できるように、IDisposableそれらをに埋め込む必要があります。using

参照: http: //msdn.microsoft.com/en-us/library/yh598w02.aspx

于 2013-02-19T06:40:02.200 に答える
2

1 回だけヒットする必要があるときに、データベースを 2 回ヒットしています。最新の日付を取得してから、データベースに再度アクセスして、対応する call_no を取得します。max(call_no) は 2 つのクエリの間のわずかな時間でも変化する可能性があるため、これは安全ではありません。

//get the latest [call_no] and [tdate]. No need for a 2cd trip with max(call_no)
SELECT * FROM(select call_no, tdate from tbl_IThelpdesk order by call_no desc)where ROWNUM = 1

また、データ アクセス コードは UI コードと混在しています。1 つのことを行うデータ アクセス メソッドを作成する必要があります。必要なデータを返します。これにより、アルゴリズムのメインフローをたどるのがずっと簡単になります。

于 2013-02-19T15:11:20.480 に答える