2010-08-12 3 views
1

Я разрабатываю сайт asp.net с использованием типизированного набора данных как DAL, все отлично работает до сегодняшнего дня я не собирался, чтобы добавить некоторые новые функциональные возможности на мой сайт вот аннотация:В чем причина странного поведения типизированного набора данных?

прибудет сумма от amount_field из user_table и рассчитать что-то обновит user_table

вот мой SQL запрос для получения amount_field в типизированного набора данных:

select userId , Amount from [user] WHERE [email protected] 

Я назвал этот запрос: getUserCreditByID (@userid)

и в моем BLL я называю этот запрос таким следующим образом:

public static int getuseramount(long id) 
{ 
    int amount = 0; 
    userTableAdapters.userTableAdapter usert = new userTableAdapters.userTableAdapter(); 
    user.userDataTable userd = usert.GetUserCreditByID(id); 
    foreach (user.userRow R in userd) 
    { 
     amount = R.Amount; 
    } 
    usert.Dispose(); 
    userd.Dispose(); 

    return amount; 
} 

и когда я вызываю эту функцию, я получаю эту ошибку:

Не удалось включить ограничения. Один или строк содержат значения, нарушающие непустые, уникальные или внешние ключи .

, но когда я изменить SQL запрос Дал в в этом:

SELECT  userID, username, password, address1, address2, tel1, tel2, cell, active, email, showEmail, last_login, Amount, registerdate, websiteUrl, vote, registerIP, city, 
         firstname, lastname 
FROM   [user] 
WHERE  (userID = @userid) 

все работает отлично

Я ошеломленно об этом, в чем проблема?

ответ

1

В любом случае лучше включить все поля в таблице пользователей; возможно, потому что поля были опущены, он вставляет нуль? Вероятно, растяжение ...

Еще лучше, если вы просто хотите эти два поля, используйте хранимую процедуру обновления, чтобы у вас был более мелкий контроль над обновлением и можно корректно обновить это поле. Если вы сопоставляете процесс обновления с таблицей, то обновление должно работать нормально.

+0

Я думаю, это единственный ответ . Есть некоторые проблемы с типизированным набором данных, но они облегчают мою жизнь, поэтому мне больше не нужно писать DAL –

+0

. Другая альтернатива (если у вас есть контроль над DataSet) создать целенаправленную таблицу в вашем DataSet, используя только нужные вам поля. –

1

Я должен угадать, где исключение получить (бросьте это совет, чтобы включить это в свои вопросы, так как это облегчает вам правильный ответ :)) , но я предполагаю, что это в этой строке:

user.userDataTable userd = usert.GetUserCreditByID(id); 

если вы userDataTable имеет ограничение есть очень хороший шанс, что возвращаемый результат нарушают некоторые из них, так как вы в действительности возвращаете только подмножество каждой записи, которая также объясняет, почему возвращение всех полей исправляет проблему (которая, по крайней мере, была бы достоверной, если ограничения в БД отражаются в типизированном наборе данных)

+0

это точная строка, что у меня есть проблема, но я действительно не могу понять, где эта проблема возникает. , поэтому, я думаю, я должен добавить всю запись в мой datatable, а затем получить все, что захочу. приветствует –

1

Вы используете типизированный DataSet в своем DAL, правильно? Если это так, вы можете установить для свойства EnforceConstraints в DataSet значение false для продолжительности этого запроса, и оно должно игнорировать, что некоторые из ваших полей равны нулю.

+0

даже с принудительным ограничением. У меня такая же проблема –

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