工程数据库编程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工程数据库编程相关的知识,希望对你有一定的参考价值。

本人从事于工程建设项目,目前由于项目标段划分较多。现希望有一个软件能够建立一个每个标段每天的工程进展,录入方式采用手动即可,然后希望能拥有的功能有能够将任意一个时间段的总量显示出来,能够生成每天工作量的曲线图,操作方便,界面简洁。

请问这样的要求最好用什么软件去做 其次做成这样的一个数据库难度多大,对于没有这样知识和经验的人多久能够做出来, 或者说还有何其他方法。不胜感激!

1.提取单条记录
/*
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
*/
CoInitialize(NULL);
_bstr_t varSource="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb";
//_bstr_t varSource="Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;"
_ConnectionPtr m_pConnection(_uuidof(Connection));
m_pConnection->Open(varSource,"","",adModeUnknow);
_RecordsetPtr m_pSet(_uuid(Recordset));
try
m_pSet->Open(%%1,m_pConnection.GetInterfacePtr()
adOpenDynamic,adLockPessimistic,adCmdText);

catch(_com_error *e)

AfxMessageBox(e->ErrorMessage());
return;

_variant_t var;
CString %%2="";
long fldc=m_pSet->GetFields()->GetCount();
long i=0;
try
m_pSet->MoveFirst();
if(!m_pSet->adoEOF)

for(i=0;i<fldc;i++)

var=m_pSet->GetCollect((long)i);
var.ChangeType(VT_BSTR);
%%2+=var.bstrVal;
%%2+=" ";

//m_pSet->MoveNext();


catch(_com_error *e)
AfxMessageBox(e->ErrorMessage());
delete e;

//m_pSet->MoveFirst();
CoUninitialize(NULL);

2.单值比较
/*
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
*/
CoInitialize(NULL);
_bstr_t varSource="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb";
//_bstr_t varSource="Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;"
_ConnectionPtr m_pConnection(_uuidof(Connection));
m_pConnection->Open(varSource,"","",adModeUnknow);
_RecordsetPtr m_pSet(_uuid(Recordset));
try
m_pSet->Open(%%1,m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockPessimistic,adCmdText);

catch(_com_error *e)

AfxMessageBox(e->ErrorMessage());
return;

_variant_t var;
try
m_pSet->MoveFirst();
if(!m_pSet->adoEOF)

var=m_pSet->GetCollect((long)0);
var.ChangeType(VT_I2);
int %%3=var.intVal;
if(%%3==%%4)

%%5

//m_pSet->MoveNext();

catch(_com_error *e)
AfxMessageBox(e->ErrorMessage());
delete e;

//m_pSet->MoveFirst();
CoUninitialize(NULL);

3.显示表格
/*
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")
*/
CoInitialize(NULL);
_bstr_t varSource="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=*.mdb";
//_bstr_t varSource="Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;"
_ConnectionPtr m_pConnection(_uuidof(Connection));
m_pConnection->Open(varSource,"","",adModeUnknow);
//打开属性为默认(adModeRead(只读),adModeWrite(可写),adModeReadWrite(可读写)等)
_RecordsetPtr m_pSet(_uuid(Recordset));
try
HRESULT hr=m_pSet->Open(%%1,m_pConnection.GetInterfacePtr(),
adOpenDynamic,adLockPessimistic,adCmdText);

catch(_com_error *e)
AfxMessageBox(e->ErrorMessage());

if(SUCCESSED(hr))

//表打开成功

FieldsPtr p_fields=m_pSet->Fields;
FieldPtr p_field;
_variant_t var_index;
LPCSTR field_name;
int index=0;
_bstr_t bstr_field_name;
int countfields=p_fields->GetCount();
CString *Column=new CString[countfields];
CListCtrl *pList=(CListCtrl*)GetDlgItem(%%1);//IDC_LIST_TABLEDATA
VERIFY(pList);
pList->DeleteAllItems();
for(index=0;index<countfields;index++)

var_index.vt=VT_I4;
var_index.IVal=index;
p_field=p_fields->Item[var_index];
bstr_field_name=p_field->GetName();
field_name=(LPCSTR)bstr_field_name;
Column[index]=field_name;
int ColumnWidth=Column[index].GetLength()*15;
pList->InsertColumn(index,field_name,LVCFMT_CENTER,ColumnWidth);

int i=0;
_bstr_t vCol;
//pList->SetTextBkColor(RGB(122,200,122));
//pList->SetTextColor(RGB(0,0,200));
while(!m_pSet->adoEOF)

pList->Insert(i,atoi(i));
for(int j=0;j<countfields;j++)

vCol=m_pSet->GetCollect((long)j);
pList->SetItemText(i,j,vCol);

m_pSet->MoveNext();
i++;

CoUninitialize(NULL);
22.批量执行SQL和存储过程
22.1、如果用ODBC访问数据库的话,可参考下列代码:
CDatabase * pDatabase = new CDatabase;
TRY

pDatabase->OpenEx( _T("DSN=ODBCName;UID=%%1;PWD=%%2"), CDatabase::noOdbcDialog);

CATCH (CDBException, e)

delete pDatabase;
return;
END_CATCH
SQL.Format("exec sp_Name");//有参数的话直接写再后面
pDatabase->ExecuteSQL(SQL);
pDatabase->Close();
delete pDatabase;

22.2、用ADO调用存储过程
_ConnectionPtr Conn = NULL;
_RecordsetPtr Rs = NULL;
_CommandPtr Cmd = NULL;
CoInitialize(NULL);
Conn.CreateInstance ( __uuidof(Connection));
Rs.CreateInstance (__uuidof(Recordset));
Cmd.CreateInstance (__uuidof(Command));
Conn->Open(L"db", L"sa", L"", adOpenUnspecified); //打开正常
//如下为_CommandPtr对象参数的赋值和调用
Cmd->ActiveConnection = Conn;
Cmd->CommandText = "SP_TEST";
//数据库中实际存在这个测试存储过程,select * from atable,不传递参数
Cmd->CommandType = adCmdStoredProc;
Cmd->Parameters->Refresh();
Rs = Cmd->Execute( NULL,NULL, adCmdUnknown ); //COM出错。
//注释掉的代码为直接的SQL语句提交,运行正确。
//Cmd->ActiveConnection=Conn;
//Cmd->CommandText = "select * from atable";
//Cmd->CommandType = adCmdText;
//Cmd->Parameters->Refresh();
//Rs = Cmd->Execute(NULL,NULL,adCmdUnknown);
Rs->Close();
Conn->Close();
CoUninitialize();
参考技术A

  当前各种主流数据库有很多,包括Oracle, MS SQL Server, Sybase, Informix, mysql, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。数据库编程是对数据库的创建、读写等一列的操作。数据库编程分为数据库客户端编程与数据库服务器端编程。数据库客户端编程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;数据库服务端编程主要使用OLE DB等方法。数据库编程需要掌握一些访问数据库技术方法,还需要注意怎么设计高效的数据库、数据库管理与运行的优化、数据库语句的优化。

    访问数据库技术方法

    数据库编程分为数据库客户端编程与数据库服务器端编程。数据库客户端编程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;数据库服务端编程主要使用OLE DB等方法。

    几种是数据库访问方法比较

  ODBC   API是一种适合数据库底层开发的编程方法,ODBC   API提供大量对数据源的操作,ODBC   API能够灵活地操作游标,支持各种帮定选项,在所有ODBC相关编程中,API编程具有最高的执行速度。

  DAO提供了很好的数据库编程的对象模型.但是,对数据库的所有调用以及输出的数据都必须通过Access/Jet数据库引擎,这对于使用数据库应用程序,是严重的瓶颈。

  OLE   DB提供了COM接口,与传统的数据库接口相比,有更好的健壮性和灵活性,具有很强的错误处理能力,能够同非关系数据源进行通信。

  ADO最主要的优点在于易于使用、速度快、内存支出少和磁盘遗迹小。

  ADO.NET 是利用数据集的概念将数据库数据读入内存中,然后在内存中对数据进行操作,最后将数据集数据回写到源数据库中。

  OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++编译中操控关系数据库的模板库, OTL中直接操作Oracle主要是通过Oracle提供的OCI接口进行,进行操作DB2数据库则是通过CLI接口来进行,至于MS的数据库和其它一些数据库,则OTL只提供了ODBC来操作的方式。当然Oracle和DB2也可以由OTL间接使用ODBC的方式来进行操纵。具有以下优点:跨平台;运行效率高,与C语言直接调用API相当;开发效率高,起码比ADO.net使用起来更简单,更简洁;部署容易,不需要ADO组件,不需要.net framework 等。

      

<1.>通用方法   

  1. ODBC连接   

  ODBC(Open   DataBase   Connectivity)是MSOA的一部分,是一个标准数据库接口。它提供对关系数据库访问的统一接口,实现对异构数据源的一致访问。

ODBC数据访问由以下部分组成:   

  <1>句柄(Handles):ODBC使用句柄来标识ODBC环境、连接、语句和描述器.   

  <2>缓存区(Buffers):   

  <3>数据类型(Data   types)   

  <4>一致性级别(Conformance   levels)   

  用ODBC设计客户端的一般步骤:   

  <1>分配ODBC环境   

  <2>分配连接句柄   

  <3>连接数据源   

  <4>构造和执行SQL语句   

  <5>获得查询结果   

  <6>断开数据源的连接   

  <7>释放ODBC环境   

    ODBC   API是一种适合数据库底层开发的编程方法,ODBC   API提供大量对数据源的操作,ODBC   API能够灵活地操作游标,支持各种帮定选项,在所有ODBC相关编程中,API编程具有最高的执行速度.因此,ODBC   API编程属于底层编程。 

2. MFC   ODBC连接   

  MFC   ODBC是MFC对ODBC进行的封装,以简化对ODBC   API的 调用,从而实现面向对象的数据库编程接口.   

  MFC   ODBC的封装主要开发了CDatabase类和CRecordSet类   

  (1) CDatabase类   

  CDatabase类用于应用程序建立同数据源的连接。CDatabase类中包含一个m_hdbc变量,它代表了数据源的连接句柄。如果要建立CDatabase类的实例,应先调用该类的构造函数,再调用Open函数,通过调用,初始化环境变量,并执行与数据源的连接。在通过Close函数关闭数据源。

  CDatabase类提供了对数据库进行操作的函数及事务操作。   

  (2) CRecordSet类   

  CRecordSet类定义了从数据库接收或者发送数据到数据库的成员变量,以实现对数据集的数据操作。   

  CRecordSet类的成员变量m_hstmt代表了定义该记录集的SQL语句句柄,m_nFields为记录集中字段的个数,m_nParams为记录集所使用的参数个数。

  CRecordSet的记录集通过CDatabase实例的指针实现同数据源的连接,即CRecordSet的成员变量m_pDatabase.   

  MFC   ODBC编程更适合于界面型数据库应用程序的开发,但由于CDatabase类和CRecordSet类提供的数据库操作函数有限,支持的游标类型也有限,限制了高效的数据库开发。在编程层次上属于高级编程。 

应用实例:

1.打开数据库

    CDatabase database;

    database.OpenEx( _T( "DSN=zhuxue" ),CDatabase::noOdbcDialog);//zhuxue为数据源名称

    2.关联记录集

    CRecordset recset(&database);

    3.查询记录

    CString sSql1="";

     sSql1 = "SELECT * FROM tablename" ;

      recset.Open(CRecordset::forwardOnly, sSql1, CRecordset::readOnly);

    int ti=0;

    CDBVariant var;//var可以转换为其他类型的值

     while (!recset.IsEOF())

            

       //读取Excel内部数值

       recset.GetFieldValue("id",var);

       jiangxiang[ti].id=var.m_iVal;

       recset.GetFieldValue("name", jiangxiang[ti].name);

       ti++;

       recset.MoveNext();

      

    recset.Close();//关闭记录集

    4.执行sql语句

    CString sSql="";

     sSql+="delete * from 院系审核";//清空表

     database.ExecuteSQL(sSql);

    sSql也可以为Insert ,Update等语句

    5.读取字段名

     sSql = "SELECT * FROM Sheet1" ;    //读取的文件有Sheet1表的定义,或为本程序生成的表.

       // 执行查询语句

       recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);

       int excelColCount=recset.GetODBCFieldCount();//列数

       CString excelfield[30];

      //得到记录集的字段集合中的字段的总个数

      for( i=0;i<excelColCount;i++)

      

       CODBCFieldInfo fieldinfo;

       recset.GetODBCFieldInfo(i,fieldinfo);

       excelfield[i].name =fieldinfo.m_strName;//字段名

        

    6.打开excel文件

    CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动

     CString sSql,sExcelFile; //sExcelFile为excel的文件路径

    TRY

    

      // 创建进行存取的字符串

      sSql.Format("DRIVER=%s;DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\\"%s\\";DBQ=%s",sDriver, sExcelFile, sExcelFile);

      // 创建数据库 (既Excel表格文件)

      if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )

    

    //可以把excel作为一个数据库操作

    

    

     catch(e)

    

      TRACE1("Excel驱动没有安装: %s",sDriver);

      AfxMessageBox("读取失败,请检查是否定义数据区Sheet1");

    

如何以编程方式撤销、推断、反编译、逆向工程用于在数据集中构造变量的算法

【中文标题】如何以编程方式撤销、推断、反编译、逆向工程用于在数据集中构造变量的算法【英文标题】:how to programmatically back-out, deduce, decompile, reverse-engineer the algorithm used to construct a variable in a data set 【发布时间】:2013-08-14 05:51:55 【问题描述】:

我正在寻找一些算法或程序或函数来推断变量是如何创建的,只要我提供其他变量。我认为计算机程序员会称之为“反编译”,架构师会称之为“逆向工程”,但我想我不知道统计学家会称之为什么......或者是否有公认的方法来做到这一点。

假设我在名为newvardata.frame 中有一个分类 列,但我不知道它是如何构建的。但我确实知道创建它时使用了哪些变量……或者至少我可以提供一组详尽的用于创建它的变量——即使并非所有变量都被使用。

# start with an example data set
x <- mtcars

# # # # # # # # # # # # # # # # # # # # # # # #
# pretend this block of code is a black box
x <-
    transform(
        x ,
        newvar =
            ifelse( mpg > 24 , 1 ,
            ifelse( cyl == 6 , 9 ,
            ifelse( hp > 120 , 4 ,
            ifelse( mpg > 22 , 7 , 2 ) ) ) )
    )
# end of unknown block of code
# # # # # # # # # # # # # # # # # # # # # # # #

# now knowing that `mtcars` has only 11 columns to choose from
names(x)

# how were these 11 columns used to construct `newvar`?
table( x$newvar )

# here's a start..
y <- data.frame( ftable( x[ , c( 'mpg' , 'cyl' , 'hp' , 'newvar' ) ] ) )
# ..combinations with any records
y[y[,5]!=0,]
# but that's not enough to back-out the construction

所以我认为您可以使用线性回归或决策树来取消 newvar 的构造,但这仍然需要进行一些思考并将系数拼凑在一起,以准确弄清楚黑匣子内发生了什么。

是否有任何可用的算法可以猜测黑匣子,可以这么说?谢谢!!

【问题讨论】:

Gordon Way 编写了一款名为“Reason”的软件,正是这样做的。 抱歉,我的 babelfish 没有正确放入,请重复一遍好吗? crantastic.org/packages/emulator 使用这种魔法将程序视为黑匣子 @AnthonyDamico bit.ly/122gnOx @AriB.Friedman 哈哈,我明白了,你的蛇球。 :P babelfish 和 gordon way 都是道格拉斯·亚当斯的作品。 【参考方案1】:

一般来说,不会。即使应用了大量关于可能发生的事情的知识,它仍然(可能)不是。让我从你的例子中向你展示一个例子。添加“黑匣子”的知识,即输出是离散值并且它们是基于其他值的阈值导出的,分类树应该能够恢复标准。所以:

library("party")
tmp <- ctree(factor(newvar) ~ ., data=x, 
  controls=ctree_control(mincriterion=0, minsplit=2, minbucket=1))

我已将控制值设置为完全不合理的值,以强制算法驱动每个存储桶只包含一个值。即便如此,它也不是你开始的:

所以用一个简单的例子,加上更多关于转换的知识,是做不到的,一般情况下真的没有希望能做到。

【讨论】:

【参考方案2】:

反编译是完全不同的东西。它检查实际的源代码,并生成一个产生相同结果的程序。它主要适用于编译成基本上等同于源代码的中间语言的语言(减去 cmets、变量名等)。由于汇编程序本质上可以 1:1 表示机器代码,因此您可以将完全编译的程序反编译成汇编程序(但这意味着您真的了解它们的作用,或者它们是用汇编程序编写的)。 p>

现在,如果您尝试对数据转换执行此操作,则只能希望以一定的概率获得此结果。这就像试图通过查看输出来反编译程序

我相信您最感兴趣的技术是决策树,因为它们会产生人类可解释的结果,可以很容易地转化为许多原始表达式(如果这样,那么那样) .

很有可能,树仍然会出现不同的见解,而不是用于构建数据的见解。

永远记住,构造可以是任意复杂的,包括随机

你不能期待完美的结果。如果您想要可读结果并希望避免过度拟合,决策树可能“尽其所能”。

回忆过拟合:表达式可能总是

if record == record1 then
  result = result1
else if record == record2 then
  result = result2
...
else if record == recordn then
  result = resultn
else
  result = random or fail badly

这将完美地重构转换。但它完全无用

【讨论】:

以上是关于工程数据库编程的主要内容,如果未能解决你的问题,请参考以下文章

软件工程------结对编程第二次

Java软件工程师主要学习哪些课程?

网易2016研发工程师编程题:路灯

如何以编程方式撤销、推断、反编译、逆向工程用于在数据集中构造变量的算法

在WEB工程的web层中的编程技巧

Python IO编程和软件工程需求分析