2014-02-05 4 views
0

Я пытаюсь вставить несколько строк в базе данных, но я получил сообщение об ошибке при выполнении этого кода:C++ ADO.NET не удается вставить значение NULL в столбец

#using <mscorlib.dll> 
#using <System.dll> 
#using <system.data.dll> 
#using <System.Xml.dll> 

#include <sstream> 
#include <time.h> 
#include <string> 
#include <iostream> 
#include <tchar.h> 

using namespace System; 
using namespace System::Data; 
using namespace System::Xml; 
using namespace System::Data::SqlClient; 

// This is the entry point for this application 
int _tmain(void) 
{ 
    SqlConnection ^mySQLConnection; 
    SqlDataAdapter ^myDataAdapter; 
    DataSet   ^myDataSet; 
    DataRow   ^myRow; 
    SqlParameter  ^myParameter; 

    try 
    { 
     mySQLConnection = gcnew SqlConnection("Data Source=NECTARYS-PC;Initial Catalog=MonitoringN;Integrated Security=True;"); 
     myDataAdapter = gcnew SqlDataAdapter(); 
     myDataSet = gcnew DataSet(); 

     // Open up the connection 
     mySQLConnection->Open(); 

     myDataAdapter->SelectCommand = gcnew SqlCommand("select motif,dateAlerte,fixee,nomPoste," + 
     "nomApplication,nomFichier,FichierModel_id from Alerte", mySQLConnection); 

     myDataAdapter->InsertCommand = gcnew SqlCommand("insert into Alerte (motif,dateAlerte," + 
      "fixee,nomPoste,nomApplication,nomFichier,FichierModel_id) values (@motif,@dateAlerte," + 
      "@fixee,@nomPoste,@nomApplication,@nomFichier,@FichierModel_id)", mySQLConnection); 

     myParameter = myDataAdapter->InsertCommand->Parameters->Add(
      gcnew SqlParameter("@motif", SqlDbType::VarChar)); 
     myParameter->SourceColumn = "motif"; 
     myParameter->SourceVersion = DataRowVersion::Current; 

     myParameter = myDataAdapter->InsertCommand->Parameters->Add(
      gcnew SqlParameter("@dateAlerte", SqlDbType::VarChar)); 
     myParameter->SourceColumn = "dateAlerte"; 
     myParameter->SourceVersion = DataRowVersion::Current; 

     myParameter = myDataAdapter->InsertCommand->Parameters->Add(
      gcnew SqlParameter("@fixee", SqlDbType::Bit)); 
     myParameter->SourceColumn = "fixee"; 
     myParameter->SourceVersion = DataRowVersion::Current; 

     myParameter = myDataAdapter->InsertCommand->Parameters->Add(
      gcnew SqlParameter("@nomPoste", SqlDbType::VarChar)); 
     myParameter->SourceColumn = "nomPoste"; 
     myParameter->SourceVersion = DataRowVersion::Current; 

     myParameter = myDataAdapter->InsertCommand->Parameters->Add(
      gcnew SqlParameter("@nomApplication", SqlDbType::VarChar)); 
     myParameter->SourceColumn = "nomApplication"; 
     myParameter->SourceVersion = DataRowVersion::Current; 

     myParameter = myDataAdapter->InsertCommand->Parameters->Add(
      gcnew SqlParameter("@nomFichier", SqlDbType::VarChar)); 
     myParameter->SourceColumn = "nomFichier"; 
     myParameter->SourceVersion = DataRowVersion::Current; 

     myParameter = myDataAdapter->InsertCommand->Parameters->Add(
      gcnew SqlParameter("@FichierModel_id", SqlDbType::Int)); 
     myParameter->SourceColumn = "FichierModel_id"; 
     myParameter->SourceVersion = DataRowVersion::Current; 

     time_t now = time(0); 
     tm ltm; 
     localtime_s(&ltm,&now); 
     std::stringstream dateAjoutSysteme; 
     dateAjoutSysteme << ltm.tm_mday 
      << "/" 
      << 1 + ltm.tm_mon 
      << "/" 
      << 1900 + ltm.tm_year 
      << " " 
      << 1 + ltm.tm_hour 
      << ":" 
      << 1 + ltm.tm_min 
      << ":" 
      << 1 + ltm.tm_sec; 
     String^ str = gcnew System::String(dateAjoutSysteme.str().c_str()); 

     Boolean fixee = true; 

     myDataAdapter->Fill(myDataSet, "Alerte"); 
     myRow = myDataSet->Tables["Alerte"]->NewRow(); 
     myRow->ItemArray[0] = "A"; 
     myRow->ItemArray[1] = str; 
     myRow->ItemArray[2] = fixee; 
     myRow->ItemArray[3] = "B"; 
     myRow->ItemArray[4] = "C"; 
     myRow->ItemArray[5] = "D"; 
     myRow->ItemArray[6] = 0UL; 
     myDataSet->Tables["Alerte"]->Rows->Add(myRow); 

     //we use insertcommand property for the update. 
     myDataAdapter->Update(myDataSet, "Alerte"); 
    } 
    catch (Exception^e) { 
     Console::Write(e->ToString()); 
    } 
    __finally { 
     mySQLConnection->Close(); 
     system("PAUSE"); 
    } 
    return 0; 
} 

ошибка:

System.Data.SqlClient.SqlException (0x80131904): Не удается вставить значение NULL в столбце «fixee», таблица «MonitoringN.dbo.Alerte»; столбец не разрешает ошибки.

Любая блестящая идея, пожалуйста?

ответ

0

вы делаете выбор * на Alerte ... так что вы не знаете порядок столбцов ... тогда вы назначаете значения из-за индекса столбца ... Я думаю, есть проблема ... fixee is вероятно, не второй столбец в myDataSet-> Tables ["Alerte"]

+0

Правильно, у меня есть столбец идентификатора, который сначала входит в таблицу Alerte, которая автоматически генерируется, поэтому я не могу ее вставить, m не инициализирует его значение. Затем я обновил свой код 'myDataAdapter-> SelectCommand = gcnew SqlCommand (« выберите мотив, dateAlerte, fixee, nomPoste »,« + »nomApplication, nomFichier, FichierModel_id от Alerte», mySQLConnection); и у меня такая же ошибка. « – user3264174

+0

hmmm ... вы пытались присвоить значения по имени своему myRow? в C# он должен работать следующим образом: myRow ["fixee"] = true; ... и посмотрели ли вы на свою таблицу после того, как вы ввели новую строку в отладчик? – PrfctByDsgn

+0

работает, когда вы удаляете такие строки: myParameter-> SourceVersion = DataRowVersion :: Current; ? Я не думаю, что это полезно здесь ... – PrfctByDsgn

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