永发信息网

工程数据库编程

答案:2  悬赏:60  手机版
解决时间 2021-04-04 14:30
  • 提问者网友:書生途
  • 2021-04-04 11:36
本人从事于工程建设项目,目前由于项目标段划分较多。现希望有一个软件能够建立一个每个标段每天的工程进展,录入方式采用手动即可,然后希望能拥有的功能有能够将任意一个时间段的总量显示出来,能够生成每天工作量的曲线图,操作方便,界面简洁。

请问这样的要求最好用什么软件去做 其次做成这样的一个数据库难度多大,对于没有这样知识和经验的人多久能够做出来, 或者说还有何其他方法。不胜感激!
最佳答案
  • 五星知识达人网友:一秋
  • 2021-04-04 11:42
当前各种主流数据库有很多,包括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等方法。数据库编程需要掌握一些访问数据库技术方法,还需要注意怎么设计高效的数据库、数据库管理与运行的优化、数据库语句的优化。
1. 访问数据库技术方法
数据库编程分为数据库客户端编程与数据库服务器端编程。数据库客户端编程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;数据库服务端编程主要使用OLE DB等方法。
2. 几种是数据库访问方法比较
  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       {
       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");
     }
全部回答
  • 1楼网友:轻熟杀无赦
  • 2021-04-04 12:16
1.提取单条记录 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;iGetCollect((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.单值比较 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.显示表格 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;indexItem[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;jGetCollect((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();
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯