2014-03-19 2 views
1

У меня есть gridview, привязанный к sqldatasource. Попытка запустить обновление хранимой процедуры.Ошибка: не удается вставить значение NULL в столбец

я получаю эту ошибку ...

Cannot insert the value NULL into column 'MyFKId', table 'dbo.MyTable'; 
column does not allow nulls. INSERT fails. The statement has been 
terminated. 

Я знаю ответ кажется очевидным, что я пытаюсь вставить нуль в столбец, который не позволит. Проблема в том, что я знаю, что добавляю значение в «MyFKId». В моем коде я поставил точку останова и увидел там было значение после того, как эта линия побежала ...

dsMyDataSource.UpdateParameters.Item("MyFKId").DefaultValue = SomeId 

SomeId действительно имеет значение. Это не было ошибкой. Как вы думаете, что может быть неправильно? SqlDataSource настроен следующим образом ...

<asp:SqlDataSource ID="dsMyDataSource" runat="server" ConnectionString="xxxxx" 
    SelectCommand="xxxxx" SelectCommandType="StoredProcedure" 
    UpdateCommandType="Text" 
    UpdateCommand=" Execute s_MyStoredProc @MyFKId,[email protected]"> 
     <UpdateParameters> 
      <asp:Parameter Name="MyFKId" Type="Int32" /> 
       ... 
     </UpdateParameters> 
</asp:SqlDataSource> 
+1

'Я знаю, что я помещаю значение в« MyFKId »- нет, это не так. Вы просто _think_ вы. SQL Server уверен, что вы этого не сделали. –

+1

Вам нужно будет опубликовать код в 's_MyStoredProc', чтобы получить разумный ответ. –

+0

Когда я устанавливаю точку останова, я вижу, что значение по умолчанию получает значение из переменной SomeId. После этого нет кода, который его корректирует. Где еще я должен проверить? – WebDevGuy

ответ

0

Не используйте EXECUTE для вызова хранимой процедуры. Используйте InsertCommand

<asp:SqlDataSource ID="dsMyDataSource" runat="server" ConnectionString="xxxxx" 
    InsertCommand="s_MyStoredProc" InsertCommandType="StoredProcedure"> 
     <InsertParameters> 
      <asp:Parameter Name="MyFKId" Type="Int32" /> 
       ... 
     </InsertParameters> 
</asp:SqlDataSource> 

И использовать InsertParameters для установки параметра.

dsMyDataSource.InsertParameters("MyFKId").DefaultValue = SomeId 

Невозможно попробовать, но надеемся, что это решит его для вас.

+0

Хранилище proc фактически делает INSERTS и UPDATES, в зависимости от определенных переменных и логики. Но технически, в этом контексте, он работает как запрос/команда обновления. – WebDevGuy

+0

Причина, по которой вы должны использовать InsertCommand, заключается не в том, что действительно делает ваша хранимая процедура, а в том, что она правильно назначает значения параметрам. InsertCommand гарантирует, что он не ожидает результатов этого запроса. Theres просто не UpdateCommandType = «StoredProcedure», поэтому вам нужно использовать InsertCommand для выполнения хранимой процедуры. Он должен работать для любой хранимой процедуры, которая не возвращает результаты запроса. Просто попробуйте мое предложение. – BlueM

Смежные вопросы