我有以下代码从编辑控件获取信息并写入数据库。
连接字符串和驱动程序有问题。我试图使用工具>连接数据库,但它不起作用,还有一个有趣的问题,我可以从数据库读取,但我不能写。
是否有任何关于字符串连接的建议,或者我的方法是否错误?
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);
}
答案 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;
}