2016-03-02 2 views
2

C# VS2010 Бланки заявленийC# Bound значение не соответствует базе данных

У меня есть C# проект с базой данных SQL Server (.mdf файл), который включает в себя поле ID, тип данных INT, обнуляет не допускается; так что он автоматически вводит.

В моей основной форме я привязал таблицу к источнику привязки, а поле идентификатора привязано к метке.

Все формы управления и связующие свойства для них были сделаны без кода в окне свойств.

Форма включает в себя связующее средство, которое имеет кнопку + (добавить запись). В тот момент, когда нажата кнопка +, для поля ID присваивается значение -1; предположительно как временное значение, но это происходит автоматически без какого-либо кода.

Затем, когда я вставляю все значения в связанных элементах управления в соответствующие столбцы базы данных (этот код работает правильно), за исключением идентификатора, который автоматически назначается базой данных (auto incrementing int). Так вот почему значение в связанном элементе управления не совпадает с значением, хранящимся в базе данных.

Это мешает мне продолжить создание метода для удаления записи путем ссылки на поле идентификатора, поскольку значение (-1) в связанном элементе управления недействительно, то есть такая запись не существует в базе данных.

Я пробовал метод BindingSource.ResetBindings и обновлял метку, но значение остается -1 до выхода и перезапуска программы.

Я также нашел предложения, чтобы попытаться установить BindingSource.DataSource значение null, а затем восстановить, но попытка установить источник данных или датаметр на null вызывает исключение. Я нашел другой, который предложил установить BindingSource.RaiseListChangedEvents на false, но исключение все же произошло.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Data.Sql; 
using System.Data.SqlClient; 
using System.Drawing; 
using System.IO; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace Address_Book 
{ 
    public partial class FormMain : Form 
    { 

     public FormMain() 
     { 
      InitializeComponent(); 
      //***Program Execution*** 
      fillContactGrid(); 
     }  
     private void fillContactGrid() 
     //This method retrieves and displays all records from ContactInfo 
     {   
      //Create a connection to the database 
      using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ContactsConnectionString)) 
      {    
       //Construct the SQL Query string 
       string sqlQuery = "SELECT * FROM ContactInfo"; 
       //Open the connection 
       connection.Open(); 
       //Pass the query to the database and receive dataset 
       SqlDataAdapter dataadapter = new SqlDataAdapter(sqlQuery, connection); 
       DataSet ds = new DataSet();    
       dataadapter.Fill(ds, "ContactInfo"); 
       //Close the connection 
       connection.Close(); 
       //Load the dataset into GridView 
       contactsGridView.DataSource = ds; 
       contactsGridView.DataMember = "ContactInfo"; 
      } 
     } 

     private void FormMain_Load(object sender, EventArgs e) 
     { 
      //Initialize contactsDataSet 
      this.contactInfoTableAdapter.Fill(this.contactsDataSet.ContactInfo); 
     } 

     private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e) 
     { 
      disableNavigation(); 
      //Show save and cancel buttons 
      buttonSave.Visible = true; 
      buttonCancel.Visible = true; 
     } 

     private void disableNavigation() 
     { 
      //Temporarily disable navigator controls 
      bindingNavigatorAddNewItem.Enabled = false; 
      bindingNavigatorDeleteItem.Enabled = false; 
      bindingNavigatorPositionItem.Enabled = false; 
      bindingNavigatorMoveFirstItem.Enabled = false; 
      bindingNavigatorMoveLastItem.Enabled = false; 
      bindingNavigatorMoveNextItem.Enabled = false; 
      bindingNavigatorMovePreviousItem.Enabled = false; 
     } 

     private void buttonCancel_Click(object sender, EventArgs e) 
     { 
      //Cancel new record entry 
      contactInfoBindingSource.RemoveCurrent(); 
      //Hide save and cancel buttons 
      buttonSave.Visible = false; 
      buttonCancel.Visible = false; 
      enableNavigation(); 
     } 

     private void enableNavigation() 
     { 
      //Enable navigator controls 
      bindingNavigatorAddNewItem.Enabled = true; 
      bindingNavigatorDeleteItem.Enabled = true; 
      bindingNavigatorPositionItem.Enabled = true; 
      bindingNavigatorMoveFirstItem.Enabled = true; 
      bindingNavigatorMoveLastItem.Enabled = true; 
      bindingNavigatorMoveNextItem.Enabled = true; 
      bindingNavigatorMovePreviousItem.Enabled = true; 
     } 

     private void buttonSave_Click(object sender, EventArgs e) 
     { 
      insertNewContact(); 
     } 

     private void insertNewContact() 
     {  
      using (SqlConnection connection = new SqlConnection(Properties.Settings.Default.ContactsConnectionString)) 
      { 
       //***Construct the SQL Command string 
       //Format: INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...) 
       //Command 
       string sqlCmd = "INSERT INTO "; 
       //Table name 
       sqlCmd += @"ContactInfo "; 
       //Column names 
       sqlCmd += @"(LastName, "; 
       sqlCmd += @"FirstName, "; 
       sqlCmd += @"Relationship, "; 
       sqlCmd += @"Title, "; 
       sqlCmd += @"Company, "; 
       sqlCmd += @"OfficePhone, "; 
       sqlCmd += @"OfficeExtension, "; 
       sqlCmd += @"CellPhone, "; 
       sqlCmd += @"HomePhone, "; 
       sqlCmd += @"Email1, "; 
       sqlCmd += @"Email2) "; 
       //Values 
       sqlCmd += @"VALUES "; 
       sqlCmd += @"(@LastName, "; 
       sqlCmd += @"@FirstName, "; 
       sqlCmd += @"@Relationship, "; 
       sqlCmd += @"@Title, "; 
       sqlCmd += @"@Company, "; 
       sqlCmd += @"@OfficePhone, "; 
       sqlCmd += @"@OfficeExtension, "; 
       sqlCmd += @"@CellPhone, "; 
       sqlCmd += @"@HomePhone, "; 
       sqlCmd += @"@Email1, "; 
       sqlCmd += @"@Email2)"; 
       //Open the connection 
       connection.Open(); 
       //Pass the command to the database 
       using (SqlCommand command =new SqlCommand(sqlCmd, connection)) 
       { 
        command.Parameters.Add("@LastName", SqlDbType.NChar).Value = textLastName.Text; 
        command.Parameters.Add("@FirstName", SqlDbType.NChar).Value = textFirstName.Text; 
        command.Parameters.Add("@Relationship", SqlDbType.NChar).Value = textRelationship.Text; 
        command.Parameters.Add("@Title", SqlDbType.NChar).Value = textTitle.Text; 
        command.Parameters.Add("@Company", SqlDbType.NChar).Value = textCompany.Text; 
        command.Parameters.Add("@OfficePhone", SqlDbType.NChar).Value = textOfficePhone.Text; 
        command.Parameters.Add("@OfficeExtension", SqlDbType.NChar).Value = textOfficeExtension.Text; 
        command.Parameters.Add("@CellPhone", SqlDbType.NChar).Value = textCellPhone.Text; 
        command.Parameters.Add("@HomePhone", SqlDbType.NChar).Value = textHomePhone.Text; 
        command.Parameters.Add("@Email1", SqlDbType.NChar).Value = textEmail1.Text; 
        command.Parameters.Add("@Email2", SqlDbType.NChar).Value = textEmail2.Text; 
        try 
        { 
         int rows = command.ExecuteNonQuery(); 
        } 
        catch (Exception ex) 
        { 
         MessageBox.Show(ex.Message); 
        } 
       } 
       connection.Close(); 
       buttonSave.Visible = false; 
       buttonCancel.Visible = false;     
       enableNavigation(); 
      } 
     } 

     private void tabControl1_Selected(object sender, TabControlEventArgs e) 
     { 
      //Update the binding grid when its tab is selected 
      fillContactGrid(); 
     } 
    } 
} 
+2

Можете ли вы опубликовать код, вызывающий исключение? – Eoin

+1

contactInfoBindingSource.DataSource = null; Невозможно связать с идентификатором свойства или столбца в DataSource. – ashur668

+2

Редактировать вопрос и вставить этот код, вставьте окружающий код, чтобы другие пользователи могли понять, что вы делаете - возьмите здесь код, например: http://stackoverflow.com/questions/ 35753030/collect-steps-of-two-twodimensional-arrays-2048 – Eoin

ответ

0

потребовалось некоторое время, но в конце концов нашел проблему/решение.

В FormMain_Load Visual Studio добавлена ​​строка для заполнения адаптера данных, созданного при привязке элементов управления к BindingSource;

this.contactInfoTableAdapter.Fill (this.contactsDataSet.ContactInfo);

Добавление этой строки кода после завершения команды. ExecuteNonQuery обновил данные в связанных элементах управления, а значение ID -1 было заменено на правильное значение, назначенное SQLServer.

Большое спасибо Брайану. Я узнал много нового о том, как вы помогаете мне, и я уверен, что это принесет пользу мне в будущем.

+0

Выполнение этого эффективно повторно запрашивает весь набор данных. Это не самый лучший случай, но я рад, что он работает. –

0

Вот проблема, как я могу видеть это:

Вы связывание набора данных для управления в приложении. Вы нажимаете кнопку «+», которая генерирует новую строку в вашем наборе данных и назначает по умолчанию Id из -1. Затем вы вручную вставляете эти данные через insertNewContact, однако вы никогда не извлекаете базу данных, выпущенную Id, и применяете ее к вашему набору данных. Неважно, сколько раз вы возвращаете свои привязки, если значение для поля Id остается -1 в вашем наборе данных, и вы не обновляете набор данных из базы данных.

Вы можете сделать это одним из нескольких способов. Вы можете просто позвонить по номеру fillContactGrid после insertNewContact. Или вы могли бы select @@identity в конце вашего запроса и обновить свой набор данных вручную. Для этого вам нужно будет поменять звонок по базе данных на номер command.ExecuteScalar().

В любом случае, вам необходимо восстановить этот недавно вставленный идентификатор из базы данных и обновить соответствующую строку в нашем наборе данных.

Если моя память служит мне правильной (это было какое-то время).FYI, это немного хаком, но она демонстрирует концепцию:

Добавить: sqlCmd += @"; select @@identity";

Изменение:

int rows = command.ExecuteNonQuery(); 

к:

int newid = (int)command.ExecuteScalar(); 
((DataSet)contactsGridView.DataSource).Tables["ContactInfo"].Select("Id = -1")[0].SetField("Id", newId); 
+0

fillContactGrid(); находится в моем коде в самом низу. Сетка содержит правильное значение идентификатора при обновлении, но это потому, что оно заполняется запросом, а не связано. – ashur668

+0

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

+0

Для ваших вторых предложений, я не уверен, как реализовать. Если у вас есть время, чтобы предоставить более подробную информацию, я был бы рад, пытаясь самостоятельно следовать вашему предложению. Благодаря! – ashur668

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