【ODBC】ODBC连接数据库详细说明

数据库——ODBC连接 强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan ●背景 开始机房重构了,期末之前就在登录,期末期间两周都没动机房,现在还是在机房登录这里徘徊,由于机房重构的时候还需要参看之前做的机房收费系统来找灵感,想思路,自然而然就需要用到数据库了,在连接ODBC的时候还是花费了一些时间(比预计的时间要久),自己也是亲自验证了一个道理:... 阅读详情
AI摘要

本文介绍ODBC(开放数据库互连)的基本概念、句柄管理、程序执行流程,并提供了一个使用ODBC连接Oracle数据库的学生信息表CRUD操作示例。

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内部实现上一般重新转换为执行SQLAllocEnv,SQLAllocConnect和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, //ODBC的DNS名称

"scott",SQL_NTS, //用户账号

"123",SQL_NTS);     //密码

Ø 分配语句句柄

   用户对DBC数据源的存取操作,都是通过SQL语句实现的。在这个过程中,应用程序 将通过连接向ODBC数据库提交SQL语句,以完成用户请求的操作。即通过执行SQLAllocHandle或SQLAllocStmt来分配语句句柄。调用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函数的功能是提取结果集中当前记录的某个字段值。通常可以采用一个循环以提取结果集中所有记录的所有字段值,该循环重复执行SQLFetch和SQLGetData函数,直至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表

create table stu(

sno char(11) ,

sname varchar2(10),

sex char(2),

sage number,

sdepart varchar2(30)

);

 

 

 

 

 

六、数据类型

 

 



 

 

七、参考资料

数据库系统概论 第四版 王珊 萨师煊 高等教育出版社

电子资料链接:http://pan.baidu.com/s/1su9c5


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;



【2024最新对比】ODBC vs JDBC:10倍提升数据库性能的秘密武器 ODBC和JDBC是数据库连接的两大主力,2024年对比显示各有优势。ODBC支持多语言,JDBC专为Java设计。性能方面,JDBC在Java环境下更胜一筹。优化技巧:使用连接池、批量操作和参数化查询可提升10倍性能。JDBC优势在于原生Java支持、简化异常处理和面向对象设计。选择时,Java项目首选JDBC,跨语言考虑ODBC。掌握这两种技术,轻松应对大数据挑战。想深入了解如何选择最适合你项目的数据库连接技术?点击阅读全文,解锁数据库性能提升的秘密武器!#数据库优化 #JDBC #ODBC #大数据 阅读详情

相关推荐

计算机odbc数据源管理位置,ODBC 常见数据源配置整理

1. 简介我们用golang做odbc驱动开发的任务并不多,隔段时间可能会来一个。每次开发会忘记如何配置数据源和对应的数据源链接参数配置。这里做一个整理。1.1 ODBC和JDBCODBC(Open Database Connectivity)是一组对数据库访问的标准API,其最大的优点是以统一的方式处理所有的数据库。JDBC(Java Database Connectivity)是Java与数据...

weixin_39946327的博客 4021

数据库-ODBC操作

由于ODBC只提供了一种标准的API,因此某些特定于数据库引擎的功能可能无法直接通过ODBC访问,你可能需要使用特定数据库的本地API来实现这些功能。虽然ODBC提供了一定程度的平台独立性,但在不同的操作系统上可能会有一些细微的差异,这可能需要在跨平台应用程序中进行一些额外的处理。ODBC提供了一种标准的API,使得应用程序可以在不同的操作系统上连接和操作数据库,从而实现了一定程度的平台独立性。配置和管理ODBC数据源可能需要一些额外的工作,特别是对于一些复杂的数据库配置,可能需要更多的时间和精力。

evesmith520的博客 1万+

9、其他符合ODBC或JDBC标准的数据库连接与数据处理指南

本文详细介绍了如何连接符合ODBC和JDBC标准的数据库,并通过MATLAB进行数据导入、处理大数据集以及解决常见错误的方法。内容涵盖配置数据源、使用Database Explorer应用程序和命令行操作、数据导入策略、自定义数据类型处理、大数据性能优化等方面,适用于希望提升数据库操作技能的用户。

pink7的博客 53

ODBC介绍与API使用

ODBC介绍与API使用

qq_39030233的博客 2570

Visual C++环境中MySQL ODBC驱动程序数据库连接实操

本文还有配套的精品资源,点击获取 简介:本主题旨在介绍如何在Visual C++(VC)开发环境下,通过MySQL ODBC驱动程序mysec odbc driver 3.51建立数据库连接。详细解释了ODBC的基本概念、特定驱动程序的安装与配置,以及在VC中使用ODBC API执行数据库操作。此外,涵盖了OLE DB和ADO连接方式、安全性与兼容性考虑、错误处理技巧和性能...

weixin_36178216的博客 2060

掌握数据连接:ODBC和OLE DB技术在Microsoft Access 2013中的应用

本文将深入探讨在Microsoft Access 2013中创建和使用数据连接的技术细节。通过ODBC连接字符串和OLE DB连接字符串,我们将了解如何建立与不同数据源如Access、Excel和SQL Server等的连接。同时,本文还将介绍如何使用通用数据链接文件(.udl)简化连接字符串的创建和测试过程,以及如何在VBA程序中应用这些技术。

weixin_28939623的博客 806

ODBC连接数据库详细说明

开放数据库互连(ODBC)是微软提出的数据库访问接口标准。开放数据库互连定义了访问数据库的API一个规范,这些API独立于不同厂商的DBMS,也独立于具体的编程语言。通过使用ODBC,应用程序能够使用相同的源代码和各种各样的数据库进行交互。这使得开发者不需要以特殊的数据库管理系统DBMS为目标,或者了解不同支撑背景的数据库的详细细节,就能够开发和发布客户/服务器应用程序。下面是ODBC应用系统的体系结构。

Code Writers 3812

Delphi与MySQL数据库交互:ODBC驱动指南

本文还有配套的精品资源,点击获取 简介:在Delphi开发环境中,使用ODBC驱动连接MySQL数据库是一个关键步骤。本文将详细介绍如何配置ODBC数据源以及通过ADOConnection在Delphi应用程序中实现与MySQL数据库的交互。我们将探讨ODBC的工作原理、安装MySQL ODBC驱动、创建ODBC数据源、配置ADOConnection对象以及通过ADO对象进...

weixin_35677363的博客 1812

以JavaScript连接mysql数据库为例说明通过ODBC连接数据库的通用方法

本文说明了如何编写html内联js代码连接远程数据库的方法。实际上,JavaScript因为安全性问题一般不会被用作连接数据库,推荐使用java等服务端语言来编写连接数据库的代码。 使用ODBC为应用程序连接数据库的方法实际上也早已过时,在使用java、python等服务端语言编写连接数据库的代码时,更推荐使用已封装好的模块或包,如mysql-connectoe-java-8.0.26.jar,pymysql 模块等。

有问题可关注公众号:前端研究院 后台输入问题回复 4709

具有I2S输出的多模数字麦克风ICS-43434咪头LR引脚接地或电源WS接LRCLK

ICS-43434 是一款数字 IS 输出底部收音孔麦克风。完整的 ICS-43434 解决方案包括 MEMS 传感器、信号调理、模数转换器、抽取和抗混叠滤波器、电源管理以及行业标准的 24 位 12S 接口。12S 接口允许 ICS-43434 直接连接到数字处理器,例如 DSP 和微控制器,而无需系统中的音频编解码器。

易板 5664

联想Win10改Win7设置BIOS指南

通过本文的指南,你应该能够成功地在联想Win10电脑上设置BIOS以支持Windows 7的安装和运行。尽管Windows 10提供了许多现代化的功能和改进,但如果你因特定需求而更倾向于使用Windows 7,那么本文提供的步骤将帮助你顺利实现这一转换。请记住,在更改操作系统前务必做好充分的准备工作,并在安装过程中保持耐心和细心。祝你安装顺利!

mmoo_python的博客 2040

Oracle使用DB Link连接达梦数据库

目的原有Oracle数据库使用DB Link同步到Oracle库的存储过程,因国产化信创导致目标库改为达梦数据库,调整同步方案,保证数据正常传输。方案使用Oracle提供的HS和ODBC去建立与达梦数据库的DB Link连接。(非透明网关)HS是Oracle数据库的一个基础框架,用于支持对异构数据源(非Oracle数据库)...

cnzzs的博客 1189

SIMPLIS仿真软件2.2-SIMPLIS快速入门2

SIMPLIS仿真软件2.2-SIMPLIS快速入门2导读 导读 本文承接上一篇文章。开始介绍SIMPLIS仿真部分。正如上一篇所讲的快速入门的定位,该文对SIMPLIS的三种分析模式不会很深入的讲解,只会记录下一些重要的设置和操作。对于SIMPLIS的三种分析模式的详细讲解,后面会专门撰写。如果读者还没有搭建上一篇文章中讲述的电路,那你可以点击这个链接免费下载所需的电路SIMPLIS_tutorial_buck_converter ,然后在这个电路的基础上继续进行以下操作。 ...

qq_44677482的博客 2万+

jdbc odbc连接mysql_具体说明JDBC连接数据库与ODBC连接数据的区别

展开全部异构数32313133353236313431303231363533e4b893e5b19e31333337383832据库系统是由多个异构的成员数据库系统组成的数据库系统,异构性体现为各个成员数据库之间在硬件平台、操作系统或数据库管理系统等方面的不同。 ----Internet上大量信息必须通过数据库系统才能有效管理。由于历史等原因,Internet上的数据库系统不少是异构的。为了在...

weixin_33595317的博客 379

【遥感数字图像处理(朱文泉)】各章博文链接汇总及思维导图

遥感数字图像处理(北京师范大学朱文泉教授)课程各章博文笔记汇总,及各章节思维导图

甜子yu的博客 2623

结构光三维重建2——多频外差解包裹

本文深入解析了结构光三维重建中的多频外差解包裹技术。针对四步相移法产生的相位包裹问题,该方法通过投影多组不同频率的条纹光,利用外差原理逐级解算,最终获得精确、连续的绝对相位值,是实现高精度、稳健三维重建的关键步骤。

weixin_29056101的博客 350

连接数据库的的几种方式(网页)

几种ADO连接方式:ODBC DSN,ODBC DSN-Less, OLE DB Provider,和"MS Remote" Provider.1。ODBC DSN连接I.DSN    oConn.Open "DSN=AdvWorks;" & _         "UID=Admin;" & _         "PWD=;"注意:从MDAC2.1开始就不能够在使用这样的方式了,就是只把DSN文件

网络 人生 学习 进步 2747

2026年MathorCup数学应用挑战赛大数据竞赛赛道A论文分享

本文基于250款啤酒的化学与感官数据,构建以化合物-感官关系为核心的风味解析框架。通过多输出偏最小二乘与稀疏多任务建模,实现化合物组成到感官强度的稳健映射,并分离连续预测与等级校准;结合Spearman相关网络与重复抽样稳定性分析,筛选各感官属性的关键候选化合物;在低维潜在空间中保留真实风格统计结构,生成Tripel、Kriek等风格的合理化合物谱,并实现Pils/Lager向Tripel的受约束迁移,确保缺陷指标不恶化。三问共享统一数据尺度与模型逻辑,形成可检验的“预测—解释—生成”闭环,强调化学合理性与

178

Azure SQL Database连接字符串

【代码】Azure SQL Database连接字符串。

sq8706的专栏 441

必知必会:DeepSeek-R1训练流程详解

必知必会:DeepSeek-R1训练流程详解

丨汀、的博客 287

多智能体强化学习算法【三】【QMIX、MADDPG、MAPPO】

相关文章: 1.QMIX算法简述 QMIX是一个多智能体强化学习算法,具有如下特点: 1. 学习得到分布式策略。 2. 本质是一个值函数逼近算法。 3. 由于对一个联合动作-状态只有一个总奖励值,而不是每个智能体得到一个自己的奖励值,因此只能用于合作环境,而不能用于竞争对抗环境。 4. QMIX算法采用集中式学习,分布式执行应用的框架。通过集中式的信息学习,得到每个智能体的分布式策略。 5. 训练时借用全局状态信息来提高算法效果。是后文提到的VDN方法的改进。 6. 接上一条,QMIX设计一个神经网络来

丨汀、的博客 5471

ODBC、JDBC、OLE DB 三种数据访问接口详解:区别、驱动的版本匹配、数据库连接示例

Microsoft OLE DB Driver for SQL Server发现说明https://learn.microsoft.com/zh-cn/sql/connect/oledb/release-notes-for-oledb-driver-for-sql-server?JDBC Driver for SQL Server发行说明https://learn.microsoft.com/zh-cn/sql/connect/jdbc/release-notes-for-the-jdbc-driver?

lusklusklusk的博客 299

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VB与数据库连接方式

VB与数据库的连接方式总的来说分为2种:有源连接、无源连接。其中的源指的是ODBC数据源。数据源类型可分为文件DSN、用户DSN\系统DSN三类。(OLE DB作为数据的提供者。)        有源连接:首先通过配置ODBC数据源。然后采用ADO访问ODBC数据源,完成数据库连接.格式如下:        ConnectString = "FileDSN=student.dsn;UID=sa

柠檬树 5347

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C/C++使用ODBC连接Microsoft SQL server数据库

转自【C语言】使用ODBC连接Microsoft SQL server数据库 | 学步园+http://www.xuebuyuan.com/542420.html 主要内容转载,本人加了几张图,会更清晰一点的~ 【C语言】使用ODBC连接Microsoft SQL server数据库 因为最近要用C对SQL Server进行连接,但发现网上关于这方

缎锦小妹的专栏 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

PHP 数据库 ODBC

ODBC 是一种应用程序编程接口(Application Programming Interface,API),使我们有能力连接到某个数据源(比如一个 MS Access 数据库)。

m0_72763148的博客 784

QT使用 odbc连接Mysql数据库

(1)选择适合自己QT版本的ODBC版本。具体如何查看自己QT是多少位的,可以通过QT软件上方的菜单栏 帮助->About QT Creator 查看位数。(4)安装之后在电脑左下角的搜索栏中输入ODBC即可查看安装后的ODBC。(8)完成Mysql的添加后,可以点击Test按钮测试一下能否连接。(3)下载完ODBC后,双击安装,一直点next即可完成安装。(7)这里的内容按照下面提示对应填好即可。运行代码,一般都是可以完成连接的了。

weixin_39292386的博客 1352
上一篇: 【计算机】计算机如何启动的
下一篇: 【Oracle PL/SQL程序设计之触发器】触发器实验
yzzheng_60125
博客等级 码龄10年 200粉丝 243原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值