vs2010写入txt文件_使用C++(VS2010控制台应用程序)连接access数据库并且把查询结果写入文本...

记录一下,自己搞了很长的时间

#include "stdafx.h"

#include"targetver.h"

#include

//#include

using namespace std;

/*#import生成文件 msado15.tlh,默认是有namespace ADODB {}所有内容都包在这个名字空间中。

用了no_namespace则生成的头文件中没有namespace,所有内容是全局的,否则ADODB.Connection

rename的意思就是改名了,rename("EOF","adoEOF")将EOF改名为adoEOF,以免和C语言里的EOF重名*/

#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename ("EOF", "adoEOF")

void main()

{

freopen("out.txt", "w", stdout);

CoInitialize(NULL); //初始化OLE/COM库环境

//在引入ado并初始化成功com库后,就可以使用智能指针了

_ConnectionPtr m_pConnection;

_RecordsetPtr m_pRecordset;

HRESULT hr;

try

{

hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象

// hr = m_pConnection.CreateInstance(__uuidof(Connection));//no_namespace的好处

if(SUCCEEDED(hr))

{

hr = m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=AutoSurvey.mdb;Jet OLEDB:Database Password=risingztz;","","",adModeUnknown); //access2003

// hr = m_pConnection->Open("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=test.accdb","","",adModeUnknown); //access2007

printf("成功连接数据库\n");

}

}

catch(_com_error e)///捕捉异常

{

printf("连接数据库失败!\n");

return ;

}

m_pRecordset.CreateInstance(__uuidof(Recordset)); //实例化结果集对象

//执行sql语句

try

{

char sql[300];

memset(sql,0,300);

strcat(sql,"SELECT * FROM BSMeasData");

m_pRecordset->Open(sql, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);

}

catch(_com_error* e)

{

wprintf(e->ErrorMessage());

if(m_pConnection->State)

{

m_pConnection->Close();

m_pConnection= NULL;

}

CoUninitialize();

return;

}

try

{

//若结果为空,结束

if(m_pRecordset->BOF)

{

printf("表内数据为空!");

if(m_pConnection->State)

{

m_pRecordset->Close();

m_pRecordset = NULL;

m_pConnection->Close();

m_pConnection= NULL;

}

CoUninitialize();

return;

}

cout<<"---------------------------------"<

cout<<"数据库的内容为:"<

//游标定位到第一条记录

m_pRecordset->MoveFirst();

_variant_t var[2]; //从结果集中取出的数据放到var中

char *t1[2];

while(!m_pRecordset->adoEOF)

{

var[0]= m_pRecordset->GetCollect("BSMeasX");

if(var[0].vt != VT_NULL)

{

t1[0] = _com_util::ConvertBSTRToString((_bstr_t)var[0]);

}

printf(t1[0]);

printf("\t\t");

var[1]= m_pRecordset->GetCollect("BSMeasY");

if(var[1].vt != VT_NULL)

{

t1[1] = _com_util::ConvertBSTRToString((_bstr_t)var[1]);

}

printf(t1[1]);

printf("\n");

m_pRecordset->MoveNext();

}

}

catch(_com_error *e)

{

wprintf(e->ErrorMessage());

}

//退出程序时的处理

if(m_pConnection->State)

{

m_pRecordset->Close();

m_pRecordset = NULL;

m_pConnection->Close();

m_pConnection= NULL;

}

CoUninitialize();

cout<<"---------------------------------"<

fclose(stdout);

return;

}

分享给有需要的人,代码质量勿喷。

//选择并读取TXT文件

private void btn_Path_Click(object sender, EventArgs e)

{

OpenFileDialog xjOpenFileDialog = new OpenFileDialog();

xjOpenFileDialog.Filter = "文本文件|*.txt";

if (xjOpenFileDialog.ShowDialog() == DialogResult.OK)

{

string xjFilePath = xjOpenFileDialog.FileName;

this.txt_Path.Text = xjFilePath;//显示文件路径

StreamReader sr = new StreamReader(xjFilePath, Encoding.Default);

this.txt_Content.Text = sr.ReadToEnd();//显示内容

}

}

//写入TXT文件

private void btn_In_Click(object sender, EventArgs e)

{

SaveFileDialog xjSaveFileDialog = new SaveFileDialog();

xjSaveFileDialog.Filter = "文本文件|*.txt";

if (xjSaveFileDialog.ShowDialog() == DialogResult.OK)

{

string xjFilePath = xjSaveFileDialog.FileName;

this.txt_Path2.Text = xjFilePath;//显示文件路径

if (!File.Exists(xjFilePath))

{

FileStream xjFileStream = new FileStream(xjFilePath, FileMode.Create, FileAccess.Write);

StreamWriter xjStreamWriter = new StreamWriter(xjFileStream, Encoding.Default);

xjStreamWriter.WriteLine(this.txt_Content.Text);//要写入的

xjStreamWriter.Close();

xjFileStream.Close();

MessageBox.Show("保存成功!");

}

}

}

VS2010具体窗体+代码见:点击打开链接

?文章原创,转载请注明链接

?

由于VS2010中新增加了sdf和ipch文件等浏览数据库来支持智能浏览感知编辑、显示类视图等,使得随便一个小工程就上百兆,很占用空间也不方便工程项目的打包备份。为了不使用数据库以减小VS2010中的项目文件过大,可以按下图标记的设置,即菜单栏“工具”->得到“选项”对话框->“文本编辑器”->“c/C++”->“高级”->“浏览/导航”->“禁用数据库”,将数据库禁用。

点击上图中的“选项”得到选项对话框如下:

但是禁用之后,类视图窗口就基本上不能用了,无法显示类结构和通过“项目”->“添加类”来添加类了

.真是特别的无语的功能(不能像C#和VB那样智能的功能,在这一点上可以说还不如VC6.0方便)。不过对于类个数很少且类中的方法很少的工程可以采用这种方法减肥。

另一种减肥方法是设置sdf和ipch的文件目录为专门的temp目录,统一管理。

可以通过如下设置来转移sdf文件和ipch文件的位置:

?

更多可以参考:vs2010中臃肿的ipch和sdf文件?

http://www.insearchofdesign.com/yangjun1988422@126/blog/static/47412917201074446054/

?

另外一种方法是自己写一个bat文件来清理,非常方便,下面是自己写的验证过比较好用的方法。

bat文件内容如下:

echo 正在清理VS2010工程中不需要的文件 echo 请确保本文件放置在工程目录之中并关闭VS2010 echo 开始清理请稍等......

echo 清理sdf文件 del /q/a/f/s *.sdf

echo 清理ipch文件 del /q/a/f/s ipch\*.*

echo 清理Debug文件 del /q/a/f/s Debug\*.obj del /q/a/f/s Debug\*.tlog del /q/a/f/s Debug\*.log del /q/a/f/s Debug\*.idb del /q/a/f/s Debug\*.pdb del /q/a/f/s Debug\*.ilk del /q/a/f/s Debug\*.pch del /q/a/f/s Debug\*.bsc del /q/a/f/s Debug\*.sbr

echo 清理Release文件 del /q/a/f/s Release\*.obj del /q/a/f/s Release\*.tlog del /q/a/f/s Release\*.log del /q/a/f/s Release\*.idb del /q/a/f/s Release\*.pdb del /q/a/f/s Release\*.ilk del /q/a/f/s Release\*.pch

echo 清理Temp文件 del /q/a/f/s Temp\*.*

ECHO 文件清理完毕!本程序将在3秒后退出!现在进入倒计时......... @echo off echo WScript.Sleep 300 > %temp%.\tmp$$$.vbs set /a i =3 :Timeout if %i% == 0 goto Next setlocal set /a i = %i% - 1 echo 倒计时……%i% cscript //nologo %temp%.\tmp$$$.vbs goto Timeout goto End :Next cls & echo.

新建一个txt文件,将以上内容写入其中,并保存将后缀名改为bat就可以将其放入到工程文件夹下,双击即可自动将sdf,ipch等占用空间很大的文件删除。这样的方式较之于转移浏览数据库文件的位置而言更为灵活一些,不用特别的设置VS的选项。

注意这种方式是彻底删除,不会在回收站找到。

?

返回顶部