0

私はこれを持っています:

<asp:DropDownList ID="HomeCountry" runat="server" 
    DataSourceID="CountryListEntityDS" 
    DataTextField="CountryNameEn" 
    DataValueField="CountryCode" 
    AppendDataBoundItems="True"                          
    SelectedValue="<%# Bind('HomeCountry') %>">                                              
    <asp:ListItem Text="--Select One--" Value="" />
</asp:DropDownList>

データソースは次のようになります。

<asp:EntityDataSource ID="CountryListEntityDS" runat="server" 
        ConnectionString="name=MainDataModelEntityCont" 
        DefaultContainerName="MainDataModelEntityCont" 
        EnableFlattening="False" 
        EntitySetName="Countries">
</asp:EntityDataSource>

国と --- Select One --- が最初の項目として正しくドロップダウンされます。国を持つレコードを --- 選択 --- (国を持たない) に変更し、[保存] を押した場合を除いて、すべてが正しく機能します。

次にスローします:

[SqlException (0x80131904): UPDATE ステートメントが FOREIGN KEY 制約 "FK_Account_CountryList" と競合しました。

SQL Server Management Studio でこのエラーを手動で再現しました。レコードの国フィールドを有効な値から "" に変更しようとすると発生します。同じエラーがスローされます。しかし、Nullを入れるとうまくいきます。DB 制約は基本的に、有効な値または Null のいずれかが必要であると言っています。

だから私には、C#コードは何らかの形でNullがDBに送信されず、空白の文字列になっているようです。

誰でも大歓迎です。よろしくお願いします。

4

2 に答える 2

0

SQL テーブルのデータ型が違いを生みます。

(TextBox も同様の動作をします。)

サーバーコントロールが空の文字列(つまり、 "")を受け入れることができるデータベースフィールドにバインドされている場合、保存時にそれをdbに返すというルールがあるようです。ただし、バインドできない型にバインドされている場合は、Null を返します。

したがって、上記の問題については、国コードを char(2) から int に変更すると解決しました。Null は外部キー制約に違反しませんでしたが、"" は違反しました。

于 2013-05-01T14:29:50.710 に答える