1

だから私はとを持っていtextboxますbutton。に値を入力したいのですが、呼び出された「チケット」からtextbox入力した値が見つかります。次に、「リベートスリップ」と呼ばれる「リベートスリップ」を作成したいと思います。これには2つのフィールドがあります。これは自動インクリメントされ、これは私が入力した値です(したがって、基本的には、見つけたばかりのIを「RebateSlip」テーブルに渡します)。すべての関数を呼び出された「モデル」に入れてから、イベントハンドラーで呼び出します。rowtableobjecttabletableidticketIdtextboxticketIdclassbutton

 public bool rebateslip(int ticketID)
    {
        SqlCommand myCommand = new SqlCommand("SELECT ID FROM ticket WHERE ID = @ticketID", con);
        SqlDataAdapter sqlDa = new SqlDataAdapter(myCommand);

        myCommand.Parameters.AddWithValue("@ticketID", ticketID);
        var reader = myCommand.ExecuteReader();
        return reader.HasRows;

    }

    public void createRebateslip(int ticketId)
    {
        SqlCommand myCommand = new SqlCommand("INSERT INTO RebateSlip (ticketId) VALUES (@ticketId); SELECT SCOPE_IDENTITY();", con);
        myCommand.Parameters.AddWithValue("@ticketId", ticketId);
        string insertID = (myCommand.ExecuteScalar()).ToString();
        rebateSlipList.Add(new RebateSlip(Int32.Parse(insertID), ticketId));
    }

これは1つの番号で機能しますが、別の番号を入力しようとするとエラーが発生します。コマンドに関連付けられtextboxたオープンがすでに存在し、最初にクローズする必要があります。DataReaderボタンのコードは次のとおりです。値がテーブルにある場合は、「rebatelip」を作成する必要がありますが、それも機能していません。

 private void buttonPrintRebateSlip_Click(object sender, EventArgs e)
    {

        int id;
        if (!int.TryParse(textBoxRebateSlip.Text, out id))
        {
            return;
        }
        if (model.rebateslip(id))
        {
            MessageBox.Show("Found ticket");
            //create rebate slip object
            model.createRebateslip(id);
            textBoxRebateSlip.Clear();
        }
        else
        {
            MessageBox.Show("Ticket not in database");
            textBoxRebateSlip.Clear();
        }

    }
4

3 に答える 3

2

SqlDataReader.Close メソッドからの抜粋:

関連する SqlConnection を他の目的で使用するには、SqlDataReader を使い終わったら、Close メソッドを明示的に呼び出す必要があります。

を使用する必要がありますusing Statement

public bool rebateslip(int ticketID)
{
    using(SqlCommand myCommand = new SqlCommand("SELECT ID FROM ticket WHERE ID = @ticketID", con))
    {
        using(SqlDataAdapter sqlDa = new SqlDataAdapter(myCommand))
        {

            myCommand.Parameters.AddWithValue("@ticketID", ticketID);
            using(var reader = myCommand.ExecuteReader())
            {
                return reader.HasRows;
            } 
        }
    }
}

とにかく、あなたのsqlDaSqlDataAdapter はコンテキストでは意味がありません。おそらく必要なものは次のとおりです。

public bool rebateslip(int ticketID)
{
    using(SqlCommand myCommand = new SqlCommand("SELECT ID FROM ticket WHERE ID = @ticketID", con))
    {
        myCommand.Parameters.AddWithValue("@ticketID", ticketID);
        using(var reader = myCommand.ExecuteReader())
        {
            return reader.HasRows;
        }
    }
}
于 2013-01-31T18:22:13.397 に答える
0

このようにして、リーダー変数を作成することはありません。それでも、使用パラダイムの方が優れています。

    public bool rebateslip(int ticketID)
    {
        SqlCommand myCommand = new SqlCommand("SELECT ID FROM ticket WHERE ID = @ticketID", con);
        SqlDataAdapter sqlDa = new SqlDataAdapter(myCommand);

        myCommand.Parameters.AddWithValue("@ticketID", ticketID);
        return myCommand.ExecuteReader().HasRows;
    }

    public void createRebateslip(int ticketId)
    {
        SqlCommand myCommand = new SqlCommand("INSERT INTO RebateSlip (ticketId) VALUES (@ticketId); SELECT SCOPE_IDENTITY();", con);
        myCommand.Parameters.AddWithValue("@ticketId", ticketId);
        int insertID = (int)myCommand.ExecuteScalar();
        rebateSlipList.Add(new RebateSlip(insertID, ticketId));
    }

また、(insertIDからの)InsertテーブルにticketIDを格納し、(ticketIDからの)TicketテーブルにinsertIDを格納しているようです。代わりに、insertIDとticketIDのみを格納する3番目のテーブルを使用する必要があります。これにより、複数から複数の関係を許可し、1回のアクションでそれらを変更/削除できます。

于 2013-01-31T18:38:52.590 に答える
0

reader.close使い終わったら。

また --usingまたはtry...catchブロックを使用する必要があります

于 2013-01-31T18:23:34.500 に答える