2016-05-26 10 views
0

Ich habe folgenden Code, um Informationen aus dem Bearbeitungssteuerelement zu erhalten und in die Datenbank schreiben.MFC und SQL Server-Datenbank

Es gibt ein Problem mit Verbindungszeichenfolge und Treiber. Ich habe versucht, Werkzeuge> Verbindungsdatenbank zu verwenden, aber es hat nicht funktioniert, und auch gibt es ein interessantes Problem, das ich aus der Datenbank lesen kann, aber ich kann nicht schreiben.

Gibt es irgendwelche Vorschläge für String-Verbindung, oder mache ich es falsch?

CString Name, Surname; 
m_name.GetWindowTextW(Name); 
m_surname.GetWindowTextW(Surname); 
CStringA temp1(Name); 
CStringA temp2(Surname);  
const char* pstrName = ((const char *)temp1); 
const char* pstrSurname = ((const char*)temp2); 
CDatabase database; 
CString SqlString; 
CString sDriver = _T("SQL Server"); 
CString sDsn, sMc; 
CString sFile = _T("C:\\Users\\Emaaad\\Name.mdf"); 
sDsn.Format(_T("DRIVER=SQL Native Client;SERVER=.\SQLExpress;Trusted_Connection=Yes;Initial Catalog=ADOTest"), sDriver, sMc, sFile); 
try 
{ 
    database.Open(NULL, false, false, sDsn); 
    CRecordset recset(&database); 
    SqlString = _T("insert into Categories(CatID, Category) values("); 
    SqlString.Append(Name); 
    SqlString.Append(_T(","));  
    SqlString.Append(Surname); 
    SqlString.Append(_T(")")); 
    CStringA temp3(SqlString); 
    const char* pstrSql = ((const char *)temp3); 
    database.ExecuteSQL(SqlString); 
    database.Close(); 
} 
catch (CDBException* e) 
{ 
    AfxMessageBox(e->m_strError); 
} 
+3

* "Es hat nicht funktioniert" * ist keine Fehlerbeschreibung. Wie scheitert es und welche? Dein Code hat so viele auskommentierte Zeilen, dass es ziemlich unmöglich ist zu sehen, was du versuchst. Unabhängig von Ihrem Problem (was auch immer das ist), führen Sie ein Ausnahmeobjekt aus. Wenn Sie nicht 'e' zurückwerfen, müssen Sie' e-> Delete(); 'darauf aufrufen (siehe [Exception Handling in MFC] (https://msdn.microsoft.com/de-de/library/ t078xe4f.aspx)). – IInspectable

+0

ja vielleicht aber das Hauptproblem ist die Verbindung. –

Antwort

0

Wenn „Name“ und „Nachname“ ist in char/varchar/nvarchar Spalten gespeichert werden, die sie in einfachen Anführungszeichen sein sollten ... vielleicht ist das das Problem mit der Insert-Anweisung Sie erzeugen ...

+0

danke für die antwort. aber ich habe problem mit der verbindung zu senden daten von vs2015 zu ms sql –

0

Sie haben ein CRecordset instanziiert, verwenden es aber nicht. SQL ist in Ordnung für schnell und schmutzig, aber wie Sie kompliziertere Dinge tun möchten, kann es schwierig sein, zu verwalten. Auch die direkte Verwendung von CRecordset kann restriktiv sein. Man leite aus CRecordset, wie:

Header:

class MyRecordset : public CRecordset 
{ 
    DECLARE_DYNAMIC(MyRecordset) 
public: 
    MyRecordset (CDatabase* pDatabase); 
    void Open(); 
    //you may have specialized stuff, optional 
    void OpenOrdered(LPCTSTR lpszSQLCoulomb); 

    long ds_id; 
    CDBString ds_name; 
    long ds_ordered; 

public: 
    virtual void DoFieldExchange(CFieldExchange* pFX); 
}; 

cav:

void RaCatRecordset::DoFieldExchange(CFieldExchange* pFX) 
{ 
    pFX->SetFieldType(CFieldExchange::outputColumn); 
    DBFX_Long(pFX, _T("CategoryKey"), ds_id); 
    DBFX_Text(pFX, _T("Name"), ds_name); 
    DBFX_Long(pFX, _T("Ordered"), ds_ordered); 
} 
void RaCatRecordset::Open() 
{ 
    VERIFY(CRecordset::Open(CRecordset::dynaset, _T("[Categories]"))); 
} 

Jetzt können Sie die CRecorset Methoden verwenden, um Ihre Datensätze zu verwalten. Wenn Sie die Datensatzstruktur ändern, müssen Sie nicht eine Menge SQL verwalten. Sie können hinzufügen, bearbeiten, löschen, setzen Lesezeichen, iterieren, finden ... Und mit sehr einfachen SQL-Wörtern, wenn überhaupt.

HINZUGEFÜGT: Es ist mir aufgefallen, dass es etwas Wichtiges über den Konstruktor gibt. Sie möchten m_nFields, die Anzahl der DoFieldExchage-Aufrufe festlegen oder es schlägt fehl.

IMPLEMENT_DYNAMIC(RaCatRecordset, CRecordset) 
RaCatRecordset::RaCatRecordset(CDatabase* pdb) 
    :CRecordset(pdb) 
    ,ds_id(0) 
    ,ds_ordered(0) 
{ 
    m_nDefaultType= dynaset; 
    m_nFields= 3; 
} 
+0

danke für hilfe –

+0

aber eine andere frage wie kann ich die string aus edit control in die tabelle –

+0

und eine andere frage kopieren. Wenn ich Abfrage schreiben möchte, um eine weitere Spalte hinzuzufügen, heißt es, dass Sie nicht mit der Datenbank verbunden sind. –