MFC和SQL Server数据库

时间:2016-05-26 10:57:15

标签: sql-server database mfc sql-server-express

我有以下代码从编辑控件获取信息并写入数据库。

连接字符串和驱动程序有问题。我试图使用工具>连接数据库,但它不起作用,还有一个有趣的问题,我可以从数据库读取,但我不能写。

是否有任何关于字符串连接的建议,或者我的方法是否错误?

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);
}

2 个答案:

答案 0 :(得分:0)

如果"姓名"和"姓氏"要存储到char / varchar / nvarchar列中,它们应该用单引号...也许这就是你生成的insert语句的问题...

答案 1 :(得分:0)

您已实例化CRecordset但未使用它。 SQL可以快速而肮脏,但是当你想做更复杂的事情时,它很难管理。即使直接使用CRecordset也可能具有限制性。从CRecordset派生,如:

头:

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 );
};

CPP:

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]") ) );
}

现在,您可以使用CRecorset方法管理记录。如果更改记录结构,则不需要维护一堆SQL。您可以添加,编辑,删除,设置书签,迭代,查找......如果有的话,可以使用非常简单的SQL单词。

补充:我想到构造函数有一些重要的东西。您将需要设置m_nFields,DoFieldExchage调用的数量,否则它将失败。

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