1

ストアド プロシージャで Linq to SQL を使用して単純なデータベースにクエリを実行しています。私のフォームには、いくつかのクエリ フィールド用のコントロールを備えた datagridview があります。ユーザーが通りの名前/番号/方向などを入力すると、結果がデータグリッドに返されます。グリッドは、bindingSource を bindingNavigator と共に使用して結果を取得します。ナビゲートして、DAL から list<> として結果を取得し、正常に機能する update Stored proc を呼び出すことができます。ただし、組み込みコマンドを使用して新しいレコードを追加すると、レコードがグリッドに正常に追加されますが、DataContext の DAL で GetChangeSet を使用しようとすると、0 の挿入が表示されます。

そのため、DataContext は既存のレコードへの変更を追跡していますが、追加されたレコードは表示されません。DAL でプライベートな静的データ コンテキストを使用しています。問題は、新しいレコードを追加して、それをストアド プロシージャ メソッドに渡す方法だと思いますか?? bindingsource から「追加されたレコードを取得」する方法がわかりません。または、グリッドを使用して新しいレコードを追加する必要があるかどうかを確認するにはどうすればよいですか??

DAL を呼び出す UI/フォームのコード

private void btnSearch_Click(object sender, EventArgs e)
    {
        // Call search query
        spSearchCardsResultBindingSource.DataSource = 
            SideSewer.QueryCards(permit:txtPermit.Text, 
            parcel: txtParcel.Text, streetNum: nullNum1,
            streetNum2: nullNum2, streetDirection: cbDirection.Text, 
            streetName: txtName.Text, streetType: cbType.Text,
            inspected: inspectedNull, includeAliases: ckbxAlias.Checked);
    }

    private void saveToolStripButton_Click(object sender, EventArgs e)
    {
        // This line below actually WORKS, yet it just adds the record 
        // user currently has selected may NOT be the NEW one!!
        SideSewer.InsertData((PermitInfo)spSearchCardsResultBindingSource.Current);

        if (!SideSewer.save())
            MessageBox.Show("There was a problem saving the record(s)");
    }

レコードをクエリして保存するためのコードを次に示します。保存は更新に対して機能しますが、グリッドにレコードを追加するたびに、PermitInfo のリストに追加されますが、GetChangeSet には表示されません。

private static SideSewerDataContext _dc = new SideSewerDataContext();

public static List<PermitInfo> QueryCards(string permit = null, 
string parcel = null, int? streetNum = null, int? streetNum2 = null, 
string streetDirection = null,string streetName = null, 
string streetType = null,DateTime? inspected = null, bool? includeAliases = null)
{
    try
    {
        return dc.spSearchCards(permit, parcel, streetNum, streetNum2, 
        streetDirection, streetName, streetType, inspected, includeAliases).ToList();
        }
        catch (SqlException ex)
        {
            MessageBox.Show("Error: " + ex.Message,"Error Occured!",MessageBoxButtons.OK,MessageBoxIcon.Error);
            return null;
        }
    }

    public static bool save()
    {

        ChangeSet cs = _dc.GetChangeSet();

        try
        {
            foreach (var obj in cs.Updates)
            {
                if (obj is PermitInfo)
                {
                    PermitInfo pInfo = (PermitInfo)obj;
                    _dc.spUpdatePermitInfo(pInfo.ID, pInfo.Permit, pInfo.Parcel, pInfo.StreetNumber, pInfo.StreetNumberSuffix, pInfo.StreetDirection, pInfo.StreetName, pInfo.StreetType, pInfo.Inspected, Environment.UserName.ToUpper());
                }
            }
            foreach (var obj in cs.Inserts)
            {
                if (obj is PermitInfo)
                {
                    PermitInfo pInfo = (PermitInfo)obj;
                    _dc.spInsertPermitInfo(Environment.UserName.ToUpper(), pInfo.Permit, pInfo.Parcel, pInfo.StreetNumber, pInfo.StreetNumberSuffix, pInfo.StreetDirection, pInfo.StreetName, pInfo.StreetType, pInfo.Inspected);
                }
            }
            return true;
        }
        catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
            return false;
        }
    }

これを見て、私が何を間違っているか、または私が達成する必要があることをどのように進めるかについての洞察を与えることができる人に、前もって感謝します!!

4

0 に答える 0