1. 程式人生 > >【ODBC】ODBC連線資料庫詳細說明

【ODBC】ODBC連線資料庫詳細說明

ODBC

一、ODBC簡介

開放資料庫互連(ODBC)是微軟提出的資料庫訪問介面標準。開放資料庫互連定義了訪問資料庫的API一個規範,這些API獨立於不同廠商的DBMS,也獨立於具體的程式語言。通過使用ODBC,應用程式能夠使用相同的原始碼和各種各樣的資料庫進行互動。這使得開發者不需要以特殊的資料庫管理系統DBMS為目標,或者瞭解不同支撐背景的資料庫的詳細細節,就能夠開發和釋出客戶/伺服器應用程式。下面是ODBC應用系統的體系結構。

二、ODBC控制代碼

應用程式執行後,為維護執行的狀態,ODBC 管理器和ODBC 驅動程式中必須保持足夠的控制資訊。應用程式要求ODBC 管理器和ODBC 驅動程式為ODBC

環境、每個連線以及每個SQL語句分配描述/控制資訊儲存空間,並返回指向各個儲存區的控制代碼供其使用。

  1)環境控制代碼:整個ODBC上下文的根控制代碼。標識全程資料訪問控制資訊的記憶體結構,包括有效連線控制代碼以及當前活動連線控制代碼。ODBC將環境控制代碼定義為HENV型別的變數。應用程式使用單一的環境控制代碼,在連線到資料來源以前必須申請該控制代碼。

  2)連線控制代碼:管理有關資料庫會話的所有資訊。連線控制代碼標識每個特定的連線資訊的記憶體結構。ODBC將環境控制代碼定義為HDBC型別的變數。應用程式在連線資料來源之前申請連線控制代碼。每個連線控制代碼與環境控制代碼有關,環境控制代碼上可以有多個與其有關的連線控制代碼。

  3)語句控制代碼:ODBC語句包括應用訪問資料來源的SQL語句和語句相關的管理資訊,語句控制代碼標識每個語句管理資訊的記憶體結構。ODBC將語句控制代碼定義為HSTMT型別的變數。應用程式在提交SQL請求之前也必須申請語句控制代碼。每個語句控制代碼與一個連線控制代碼有關,每個連線控制代碼上可以有多個與其有關的語句控制代碼。

三、ODBC程式執行流程

Ø 分配環境控制代碼

基於ODBC3.X版本的應用統一使用SQLAllocHandle來分配控制代碼。呼叫時設計不同的控制代碼型別就可以獲得該型別的控制代碼。但在API內部實現上一般重新轉換為執行SQLAllocEnvSQLAllocConnect

SQLAllocStmt,這樣可以達到相容和程式碼重用作用。SQLAllocEnv:用來分配環境控制代碼。

例如:ret = SQLAllocHandle(SQL_HANDLE_ENV, NULL, &oraclehenv);

Ø 分配連線控制代碼

  SQLAllocConnect:用來分配連線控制代碼。連線控制代碼提供對一些資訊的訪問,例如,在連線上的有效語句及識別符號控制代碼,以及當前是否開啟一些一個事務處理。呼叫SQLAllocConnect 函 數 獲 取 連 接 句 柄。例如:

 ret = SQLAllocHandle(SQL_HANDLE_DBC, oraclehenv, &oraclehdbc);

Ø  建立資料來源

使用已分配的連線控制代碼來建立應用程式和資料來源/資料庫系統的連線,進行控制代碼和資料來源的繫結。繫結也由目標資料來源的ODBC驅動程式完成。

如:ret = SQLConnect(oraclehdbc,                                                    

"conn",SQL_NTS, //ODBCDNS名稱

"scott",SQL_NTS, //使用者賬號

"123",SQL_NTS);     //密碼

Ø 分配語句控制代碼

   使用者對DBC資料來源的存取操作,都是通過SQL語句實現的。在這個過程中,應用程式 將通過連線向ODBC資料庫提交SQL語句,以完成使用者請求的操作。即通過執行SQLAllocHandleSQLAllocStmt來分配語句控制代碼。呼叫SQLAllocStmt 函式獲取語句控制代碼。例如:

SQLstmt= "SELECT * FROM authors"

rc= SQLAllocStmt(hdbc, hstmt)

Ø  執行SQL語句

執行SQL語句。 執行SQL 語 句 的方法比較多, 最簡單明瞭的方法是呼叫SQLAllocStmt函式,例如:

SQLstmt= "SELECT * FROM authors"

rc= SQLExecDirect(hstmt, SQLstmt, Len(SQLstmt))

    如果SQL語句被順利提交併正確執行,那麼就會產生一個結果集。檢索結果集的方法有很多,最簡單最直接的方法是呼叫SQLFetch SQLGetData 函 數。

SQLFetch函式的功能是將結果集的當前記錄指標移至下一個記錄;

SQLGetData函式的功能是提取結果集中當前記錄的某個欄位值。通常可以採用一個迴圈以提取結果集中所有記錄的所有欄位值,該迴圈重複執行SQLFetchSQLGetData函式,直至SQLFetch函式返回SQL_NO_DATA_FOUND, 這表示已經到達結果集的末尾。

DimColVal As String * 225

ColVal= String(255, 0)

Ø 結束應用程式

在應用程式完成資料庫操作, 退出執行之前,必須釋放程式中使用的系統資源。這些系統資源包括:語句控制代碼、連線控制代碼和ODBC環境控制代碼。完成這個過程的如下:

 呼叫SQLFreeStmt 函式釋放語句控制代碼及其相關的系統資源。例如:

rc= SQLFreeStmt(hstmt, SQL_DROP)

 呼叫SQLDisconnect 函式關閉連線。 例 如:

rc= SQLDisconnect(hdbc)

呼叫SQLFreeConnect函式釋放連線控制代碼及其相關的系統資源。例如:

rc= SQLFreeConnect(hdbc)

呼叫SQLFreeEnv函式釋放環境控制代碼及其相關的系統資源,停止ODBC 操作。 例如:

rc= SQLFreeEnv(henv)

7)錯 誤 處 理

所有DBCAPI函 數, 若在執行期間發生錯誤, 都將返回一個標準錯誤程式碼SQL_ERROR

一般來講,在每次呼叫ODBC API 函 數 之 後, 都應該檢查該函式返回值,確定該函式是否成功地執行,再決定是否繼續後續過程。 而詳細的錯誤資訊,可以呼叫SQLError 函式獲得。SQLError 函式將返回下列資訊: 標準的ODBC錯誤狀態碼 ODBC 資料來源提供的內部錯誤編碼錯誤資訊串

四、開發環境的配置

1.建立Oracle ODBC資料來源

對於WIN 7系統來說,開啟控制面板,找到ODBC,具體位置如下圖所示,如果沒有找到,可以在右上角搜尋欄裡面輸入ODBC,就可以找到了。

對於WIN XP系統來說,開啟控制面板,找到管理工具,找到資料來源(ODBC),顯示ODBC資料來源管理器對話方塊。對話方塊如下圖所示。

2.設定和配置一個系統DSN,單擊“系統DSN標籤”,選擇“新增”。

 

 

 

3.找到需要配置的資料來源,單擊完成,彈出如下對話框,

 

4.輸入資料來源的名稱,一個簡單的描述,使用者名稱和網路連線名。點選確認。

 

五、學生表建立

1.首先建立stu

createtable stu(

sno char(11) ,

sname varchar2(10),

sex char(2),

sage number,

sdepart varchar2(30)

);

六、資料型別

 


 

七、參考資料

資料庫系統概論 第四版 王珊 薩師煊 高等教育出版社

ODBC程式

開發工具vs2017

<database.h>

#pragma once

#ifndef _DATABASE_H
#define _DATABASE_H
#include <sql.h>
#include<sqlext.h>
#include<sqltypes.h>
typedef struct {
	SQLHENV oraclehenv;						//環境控制代碼
	SQLHDBC oraclehdbc;						//連線控制代碼
	SQLHSTMT oraclehsmt;					//語句控制代碼
	SQLRETURN ret;							//結果集
}DATABASE;


DATABASE getConnection();					//獲取連線
void init(DATABASE *d);						//初始化
void freeConnection(DATABASE d);			//釋放連線資源


#endif // !_DATABASE_H

<student.h>

#pragma once
#include "DATABASE.h"

#ifndef _STUDENT_H
#define _STUDENT_H
#include <sql.h>
#include<sqlext.h>
#include<sqltypes.h>

#define sno_length 11
#define sname_length 10
#define sdepart_length 30
#define ssex_length 5

typedef struct {
	SQLCHAR sno[sno_length], sname[sname_length], sdepart[sdepart_length], ssex[ssex_length];
	SQLSMALLINT sage;
	SQLINTEGER cbsno, cbsname, cbdepart, cbsage, cbsex;
}STUDENT;

SQLCHAR *get(SQLCHAR *p, char *s);		//將char陣列轉換SQLCHAR型別
void processSQL(SQLCHAR *sql, SQLHSTMT oraclehsmt);
void display(DATABASE d);
void getStu(char *sno, SQLHSTMT oraclehsmt);
int insert(STUDENT, DATABASE);
void deleteStu(char *sno, DATABASE d);
SQLRETURN  updateStu(STUDENT s, DATABASE d);
STUDENT inputStu();
void error(SQLRETURN err, int n);

#endif // !_DATABASE_H

<getConnection.cpp>

#include"DATABASE.h"
#include <sql.h>
#include<sqlext.h>
#include<sqltypes.h>
#include<stdlib.h>
#include <stdio.h>
#include<windows.h>
#include<string.h>
DATABASE getConnection() {
	DATABASE d;
	/****分配環境控制代碼********/
	d.ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &d.oraclehenv);
	d.ret = SQLSetEnvAttr(d.oraclehenv, SQL_ATTR_ODBC_VERSION, (void *)SQL_OV_ODBC3, 0);
	/********建立連線*********/
	d.ret = SQLAllocHandle(SQL_HANDLE_DBC, d.oraclehenv, &d.oraclehdbc);
	d.ret = SQLConnect(d.oraclehdbc, (SQLCHAR *)"con", SQL_NTS, (SQLCHAR *)"HR", SQL_NTS, (SQLCHAR *)"oracle", SQL_NTS);
	if (SQL_SUCCEEDED(d.ret))
	{
		puts("Connect Sucess!");
		init(&d);
	}
	else
	{
		//連線失敗時返回錯誤值
		puts("Conect Fail!");
	}
	return d;
}

void init(DATABASE *d)
{
	/***初始化控制代碼*/
	SQLEndTran(SQL_HANDLE_DBC, d->oraclehdbc, SQL_COMMIT);						//提交事務
	d->ret = SQLAllocHandle(SQL_HANDLE_STMT, d->oraclehdbc, &d->oraclehsmt);			//初始化語句控制代碼
	d->ret = SQLSetStmtAttr(d->oraclehsmt, SQL_ATTR_ROW_BIND_TYPE, (SQLPOINTER)SQL_BIND_BY_COLUMN, SQL_IS_INTEGER);//設定語句選項
}


void freeConnection(DATABASE d)
{
	SQLEndTran(SQL_HANDLE_DBC, d.oraclehdbc, SQL_COMMIT);				//提交事務
	SQLFreeHandle(SQL_HANDLE_STMT, d.oraclehsmt);
	SQLDisconnect(d.oraclehdbc);
	SQLFreeHandle(SQL_HANDLE_DBC, d.oraclehdbc);
	SQLFreeHandle(SQL_HANDLE_ENV, d.oraclehenv);
	printf("釋放連線\n\n");
}

<operateStudent.cpp>

#include "DATABASE.h"
#include "STUDENT.h"
#include <sql.h>
#include<sqlext.h>
#include<sqltypes.h>
#include<stdlib.h>
#include <stdio.h>


void processSQL(SQLCHAR *sql, SQLHSTMT oraclehsmt)
{
	STUDENT s;
	int count = 1;
	s.cbsno = SQL_NTS;
	s.cbsname = SQL_NTS;
	s.cbdepart = SQL_NTS;
	s.cbsage = 0;
	s.cbsex = SQL_NTS;
	SQLRETURN ret = SQLExecDirect(oraclehsmt, sql, SQL_NTS);
	if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
	{
		ret = SQLBindCol(oraclehsmt, 1, SQL_C_CHAR, s.sno, sno_length, &s.cbsno);
		ret = SQLBindCol(oraclehsmt, 2, SQL_C_CHAR, s.sname, sname_length, &s.cbsname);
		ret = SQLBindCol(oraclehsmt, 3, SQL_C_CHAR, s.ssex, ssex_length, &s.cbsex);
		ret = SQLBindCol(oraclehsmt, 4, SQL_C_LONG, &s.sage, 0, &s.cbsage);
		ret = SQLBindCol(oraclehsmt, 5, SQL_C_CHAR, s.sdepart, sdepart_length, &s.cbdepart);
	}
	/***處理結果**/
	while ((ret = SQLFetch(oraclehsmt)) != SQL_NO_DATA_FOUND )
	{
		if (ret == SQL_ERROR)
		{
			printf("erro!\n");
		}
		else
		{
			printf("\t%-3d    %s   %s   %s  %4d  %s\n", ++count, s.sno, s.sname, s.ssex, s.sage, s.sdepart);
		}
	}
}

void display(DATABASE d)
{
	SQLCHAR *sql = (SQLCHAR *)"select * from stu";
	processSQL(sql, d.oraclehsmt);
}
/*****插入********/
int insert(STUDENT s, DATABASE d)
{
	char str[100] = "insert into stu values(";
	
	char *age = (char *)malloc(sizeof(s.sage) + 1);
	_itoa_s((int)s.sage, age, 10, 10);

	strcat_s(str, sizeof(str), "'");
	strcat_s(str, sizeof(str), (char *)s.sno);
	strcat_s(str, sizeof(str), "',");

	strcat_s(str, sizeof(str), "'");
	strcat_s(str, sizeof(str), (char *)s.sname);
	strcat_s(str, sizeof(str), "',");

	strcat_s(str, sizeof(str), "'");
	strcat_s(str, sizeof(str), (char*)s.ssex);
	strcat_s(str, sizeof(str), "',");

	strcat_s(str, sizeof(str), "'");
	strcat_s(str, sizeof(str), age);
	strcat_s(str, sizeof(str), "',");

	strcat_s(str, sizeof(str), "'");
	strcat_s(str, sizeof(str), (char *)s.sdepart);
	strcat_s(str, sizeof(str), "')");

	d.ret = SQLExecDirect(d.oraclehsmt, (SQLCHAR *)str, SQL_NTS);
	error(d.ret, 77);
	return 0;

}


SQLCHAR *get(SQLCHAR *p, char *s)
{
	if ((s == NULL) || (p == NULL))
	{
		return NULL;
	}
	SQLCHAR *r = p;
	while ((*r++ = *s++) != '\0');
	return p;
}

void getStu(char *sno, SQLHSTMT oraclehsmt)
{
	SQLCHAR *sql;
	char str[100] = "select * from stu where sno = \'";
	strcat_s(str, sizeof(str), sno);
	strcat_s(str, sizeof(str), "'");
	sql = (SQLCHAR *)str;
	printf("getStu()函式\n");
	getchar();
	processSQL(sql, oraclehsmt);
}

void deleteStu(char *sno, DATABASE d)
{
	SQLCHAR *sql = NULL;
	char str[100] = "delete from stu where sno = \'";
	strcat_s(str, sizeof(str), sno);
	strcat_s(str, sizeof(str), "'");
	sql = (SQLCHAR *)str;
	d.ret = SQLExecDirect(d.oraclehsmt, sql, SQL_NTS);
	error(d.ret, 114);
}

SQLRETURN updateStu(STUDENT s, DATABASE d)
{
	SQLRETURN ret;
	SQLCHAR *sql = NULL;
	char str[100] = "update stu set ";
	char *age = (char *)malloc(sizeof(s.sage) + 1);
	_itoa_s((int)s.sage, age, 10, 10);
	strcat_s(str, sizeof(str), "sname = \'");
	strcat_s(str, sizeof(str), (char *)s.sname);
	strcat_s(str, sizeof(str), "', ");

	strcat_s(str, sizeof(str), "sex = \'");
	strcat_s(str, sizeof(str), (char *)s.ssex);
	strcat_s(str, sizeof(str), "', ");

	strcat_s(str, sizeof(str), "sage = \'");
	strcat_s(str, sizeof(str), age);
	strcat_s(str, sizeof(str), "', ");

	strcat_s(str, sizeof(str), "sdepart = \'");
	strcat_s(str, sizeof(str), (char *)s.sdepart);
	strcat_s(str, sizeof(str), "' ");

	strcat_s(str, sizeof(str), "where sno =  \'");
	strcat_s(str, sizeof(str), (char *)s.sno);
	strcat_s(str, sizeof(str), "'");
	for (int i = 0; i < sizeof(str); i++)
	{
		printf("%c", str[i]);
	}
	printf("\n");
	sql = (SQLCHAR *)str;
	ret = SQLExecDirect(d.oraclehsmt, sql, SQL_NTS);
	error(ret, 150);
	return ret;
}


STUDENT inputStu()
{
	STUDENT s;
	char sno[sno_length], sname[sname_length], ssex[ssex_length], sdepart[sdepart_length], ssage[5];
	int sage;
	fflush(stdin);
	printf("請輸入一個學號:");
	gets_s(sno, sizeof(sno));
	printf("\n請輸入一個姓名:");
	gets_s(sname, sizeof(sname));
	printf("\n請輸入一個性別:");
	gets_s(ssex, sizeof(ssex));
	printf("\n請輸入一個年齡:");
	sage = atoi(gets_s(ssage));
	printf("\n請輸入一個部門:");
	gets_s(sdepart, sizeof(sdepart));
	get(s.sno, sno);
	get(s.sname, sname);
	get(s.ssex, ssex);
	s.sage = sage;
	get(s.sdepart, sdepart);
	return s;
}

void error(SQLRETURN err, int n) {
	printf("%d ", n);
	switch (err) {
	case	SQL_SUCCESS:puts("****SQL_SUCCESS*****"); break;
	case	SQL_SUCCESS_WITH_INFO:puts("SQL_SUCCESS_WITH_INFO"); break;
	case	SQL_ERROR:puts("SQL_ERROR"); break;
	case	SQL_INVALID_HANDLE:puts("SQL_INVALID_HANDLE"); break;
	case	SQL_NO_DATA_FOUND:puts("SQL_NO_DATA_FOUND"); break;
	case	SQL_NEED_DATA:puts("SQL_NEED_DATA"); break;
	default:puts("err");
	}
}

<Test.cpp>

#include "STUDENT.h"
#include "DATABASE.h"
#include <sql.h>
#include<sqlext.h>
#include<sqltypes.h>
#include<stdlib.h>
#include <stdio.h>
#include<windows.h>
#include<string.h>

char menu()
{
	char choice;
	printf("\t a.查詢4所有人的資訊\n");
	printf("\t s.查詢個人資訊指定學號\n");
	printf("\t i.插入\n");
	printf("\t d.刪除\n");
	printf("\t u.修改\n");
	printf("\t q.退出\n");
	printf("\n **********************\n \t請輸入你的選項:");
	choice = getchar();
	return choice;

}

void deal(char choice, DATABASE d)
{
	getchar();
	switch (choice)
	{
		init(&d);
		case 'a':display(d);break;
		case 's': {
			char sno[10];
			fflush(stdin);
			printf("\n請輸入學號:");
			gets_s(sno);
			printf("sno = %s\n", sno);
			getStu(sno, d.oraclehsmt); break;
		}
		case 'i': {
			STUDENT s = inputStu();
			insert(s, d);break;
		}
		case 'd': {
			char sno[10];
			printf("請輸入學號:");
			gets_s(sno);
			deleteStu(sno, d); break;
		}
		case 'u': {
			STUDENT s = inputStu();
			updateStu(s, d);break;
		}
		case 'q': freeConnection(d); exit(0);
		default:printf("輸入錯誤,請從新輸入\n"); break;
	}
		printf("\n\t***************處理結束******************\n");
}


int main()
{	
	DATABASE database = getConnection();
	do
	{
		char c;
		c = menu();
		deal(c,database);
		getchar();
		system("cls");
	} while (true); 

	return 0;
}



<sql>

drop table stu;
create table stu(
       sno char(10),
       sname varchar2(10),
       sex char(5),
       sage number,
       sdepart varchar2(30),
       primary key(sno)
);

insert into stu values('201500730','張三','男',20,'計算機系' );
insert into stu values('201500731','李四','男',20,'計算機系' );
insert into stu values('201500732','王五','男',20,'計算機系' );
insert into stu values('201500733','趙六','男',20,'計算機系' );
commit;

select * from stu;


相關推薦

ODBCODBC連線資料庫詳細說明

ODBC一、ODBC簡介開放資料庫互連(ODBC)是微軟提出的資料庫訪問介面標準。開放資料庫互連定義了訪問資料庫的API一個規範,這些API獨立於不同廠商的DBMS,也獨立於具體的程式語言。通過使用ODBC,應用程式能夠使用相同的原始碼和各種各樣的資料庫進行互動。這使得開發者

PyQt502PyQt5連線sqlite3資料庫

PyQt5連線sqlite3資料庫 使用QSqlDatabase.addDatabase()連線sqlite,使用setDatabaseName連線相應資料庫,通過QSqlQuery()執行sql命令。 如下,我們在mypet.db資料庫的user資料表插入一條

PowerDesignerPowerDesigner連線Oracle資料庫反向匯出資料庫

1.oracle與plsql等資料倉庫配置預設配置完畢 2.新建PowerDesigner 3.建立物理模型 4.建立物理模型後,選單file會發生變化,開啟file選單下的DataBase 5.新建對應的oracle版本database 6.連線遠端or

JAVA JAVA連線MySql資料庫

步驟:1.eclipse工具連線工具:eclipse   MySQL5.6   MySQL連線驅動:mysql-connector-java-5.1.27.jar   http://cdn.mysql.com//Downloads/Connector-J/mysql-conn

J2EE2.JDBCJDBC連線資料庫(MariaDB,Mysql)(繼續之前jee的登陸例子)

零,名詞解釋 JDBC JDBC(Java Data Base Connectivity,java資料庫連線)是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。JDBC提供了一種基準,據此可以構建更高階的

Delphi學習ADOQuery連線資料庫的查詢、插入、刪除、修改

//查詢記錄procedure TForm1.Button1Click(Sender: TObject);beginADOQuery.Close;ADOQuery.SQL.Clear;ADOQuery.SQL.Add('select * from YourTABLE wher

CAS自定義資料庫連線配置

      在上一篇部落格中,對CAS進行了整體的介紹,我們知道,CAS可分為Server和Client。本篇部落格開始介紹對CAS  Sever進行的一些自定義配置。 【版本說明】:CAS Server 4.0 【下載地址】:https://github.com/aper

ASP.NETGridView連線資料庫,顯示資料

前端 1、新增控制元件GridView,新增資料來源,接著按步驟選擇自己的資料庫 新增資料來源顯示資料有倆種方法: (1)一種方法是在GridView控制元件上直接按步驟新增資料來源,及設計想要顯

mysql關於連線mysql資料庫時出現的時區錯誤time zone

錯誤來源:mysql執行報The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more than one time zone的解決方法 sql 命令結尾要加分後!!

MFC OnIdle的詳細說明

理解 輸入 成員函數 並且 重載函數 未處理 target spa 命令 轉載出處:http://blog.csdn.net/tsing_best/article/details/25055707 CWinApp::OnIdlevirtual BOOL OnIdle( LO

基礎函數的聲&返回值

com 高效率 ima tar 函數類 pac inf mage ase 以加減乘除運算為例 /* 函數的一般形式: 類型標示符 函數名(形式參數,形式參數...){ 函數體 } 類型表示符 為 該函數返回值的類型 不返回任何值的函數,返回值類型可以用voi

socket 超時連線

Java socket有兩種timeout :      建立連線timeout,      讀取資料timeout, 注意:如果想實現超時連線,需要採用一下方式進行socket連線  

postgresql 檢視資料庫叢集建立時間

原文連結:https://blog.csdn.net/ctypyb2002/article/details/80930809 使用 pg_controldata 檢視 Database system identifier $ /usr/pgsql-10/bin/pg_controldata

mysqlmysql建立資料庫,基字符集 和 資料庫排序規則 的對比選擇

1.一般選擇utf8.下面介紹一下utf8與utfmb4的區別。 utf8mb4相容utf8,且比utf8能表示更多的字元。至於什麼時候用,看你的做什麼專案了,到https://www.cnblogs.com/sxdcgaq8080/p/9932786.html看unicode編碼區從1 ~ 126就屬於傳

VUE腳手架專案搭建詳細流程

整理了一下VUE大型專案腳手架的搭建,和一些自己的理解,不對的地方歡迎指出! 第一步:下載NODE                下載NODE,在這裡是為了用到node裡邊的npm,node下載成功後 第

oracledual在資料庫不同啟動狀態其欄位數

dual在資料庫不同啟動狀態其欄位數 不經意間在《oracle DBA工作日記》看到dual這個系統表在資料庫nomount、mount、open狀態其欄位不一樣,驗證後記錄如下: --關閉資料庫   SQL> shutdown immediate Database cl

PHP全自動安裝資料庫,不需要手動匯入

author:咔咔 wechat:fangkangfk   用了很多的自動安裝資料庫的專案了,今天也來寫一個,只是一個簡單版本,可以按照這個思路來建立適合自己專案的安裝資料庫 原始碼地址問價: https://download.csdn.net/download/f

論文解讀|Densenet密集連線的卷積網路(附Pytorch程式碼講解)

@[t oc] 1 簡單介紹 論文題目:Densely Connected Convolutional Networks 發表機構:康奈爾大學,清華大學,Facebook AI 發表時間:2018年1月 論文程式碼:https://github.com/Wang

101Android GreenDao資料庫講解

GreenDao資料庫講解 在Android開發過程中,資料的快取的開發可能會使用SQLite。然而在使用它時,我們往往需要做許多額外的工作,編寫Native SQL(原生的)語句與解析查詢結果等。所

轉載dbcp連線池的簡單使用

 dbcp資料庫連線池的簡單使用---MySQL 有問題可以留言,如果你是初學者,下面的示例程式碼很不錯:)   package mysqlTest; import org.apache.commons.dbcp2.BasicDataSource; import