如何访问远程电脑上的MS SQL数据库并操作它

lanjianlele1 2008-03-19 11:40:58
要求:使用ODBC的方式,例如我在服务器电脑上的代码如下
CDatabase db;

if(!db.Open(_T("FirstODBC"), // (系统源名)

FALSE, //bExclusive

FALSE, //bReadOnly

_T("ODBC; UID=sa; PWD=sys;"), //lpszConnect (与数据库的连接方式)

FALSE))

{ //bUseCursorLib


MessageBox("Could not open database","Could not open database",MB_OK);
return;

}

CUserConnect set(&db);//基类是CRecordset

try

{

set.Open();

}

catch (CDBException* pEx)

{



TCHAR szErrorMessage[1024];

if (pEx->GetErrorMessage(szErrorMessage, sizeof(szErrorMessage)))

{


MessageBox(szErrorMessage,szErrorMessage,MB_OK);


}

return;

}


try

{

set.AddNew();

}

catch (CDBException* pEx)

{



TCHAR szErrorMessage[1024];

if (pEx->GetErrorMessage(szErrorMessage, sizeof(szErrorMessage)))

{


MessageBox(szErrorMessage,szErrorMessage,MB_OK);


}

return;

}
LPCSTR IPAddress;
char szHostName[128]; //将本机的名称存入一维数组,数组名称为szHostName
struct hostent * pHost;
if(gethostname(szHostName,128)==0)
{
pHost = gethostbyname(szHostName);
for( int i = 0; pHost!= NULL && pHost->h_addr_list[i]!= NULL; i++ )
{
IPAddress=inet_ntoa (*(struct in_addr *)pHost->h_addr_list[i]);

}
}
set.m_id=0;

set.m_user_name=szHostName;

set.m_user_sex="wu";

set.m_address=IPAddress;

set.m_age=25;

set.m_zip="wu";

set.m_phone="13590363282";
try

{

set.Update();

}

catch (CDBException* pEx)

{



TCHAR szErrorMessage[1024];

if (pEx->GetErrorMessage(szErrorMessage, sizeof(szErrorMessage)))

{


MessageBox(szErrorMessage,szErrorMessage,MB_OK);


}

return;

}


set.Close();

db.Close();
这段代码在服务器端运行,可以将相关的数据存到数据库的表格中,我在客户端也想用这种方式修改服务器的数据库,请问该如何实现
...全文
262 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
-狙击手- 2008-03-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hlq8210 的回复:]
能够连接上去的话,和操作本地库没有什么区别
[/Quote]
hlq8210 2008-03-19
  • 打赏
  • 举报
回复
能够连接上去的话,和操作本地库没有什么区别
fuda_1985 2008-03-19
  • 打赏
  • 举报
回复
你将连接打开,有权限的账号就可以做增删改查啊!!!
lanjianlele1 2008-03-19
  • 打赏
  • 举报
回复
strConnStr.Format("Driver={SQL Server};Server=%s;Database=%s;Uid=%s;Pwd=%s;", strDBServer, strDBName, strDBUser, strDBPassword);用这个格式就可以了
lanjianlele1 2008-03-19
  • 打赏
  • 举报
回复
Inspect2008你说的方法岂 不是和我的一样啊 ! 我说的是要远程访问啊,这样的方法在服务器端有效嘛,其他电脑去去打开数据源FirstODBC肯定不行啊,因为电脑上没有这个数据源呀,这个数据源是服务器上的嘛,我再看看老乌龟的方法
dawugui 2008-03-19
  • 打赏
  • 举报
回复
如果是C没有这么麻烦.

我建议你到C版去问问.

多年不搞C语言了.忘记了.
lanjianlele1 2008-03-19
  • 打赏
  • 举报
回复
我是用C开发的
tcxx2008 2008-03-19
  • 打赏
  • 举报
回复
老乌龟这么噶强的呀,
dawugui 2008-03-19
  • 打赏
  • 举报
回复
通过odbc连接sql server2007-05-30 16:28(转)

Perl 以前多数应用在Unix平台上,但最近随着微软在Internet方面的重视和投入,NT在Internet方面也占有了一席之地。相当一部分编程人员也从Unix平台转向 NT平台,Perl程序的移植非常容易做到,唯一需要注意的是:在 Unix下连接数据库时,与具体连接的数据库接入格式和相应的扩展程式有关,而且各不一样,如:与Oracle连接采用Perl-Oracle沟通界面— oraperl/DBI Extension;而在Win NT/95下,连接数据库时,则多数采用统一的格式和标准—ODBC(开放式数据库连接)server与我们这里提到的ODBC插件(For Perl)。
与其它CGI编写语言(VBScript、JavaScript-for server、C Shell、C/C ...)相比,Perl具有以下5个优点:
1 具有高度可扩展性和随时可用。(ODBC.pm就是其中的一个插件)
2 具有非常强大的字串处理功能。
3 很容易调用系统命令(shell commands),易于编写Unix系统程式。
4 具备面向对象的编程能力,代码的可维护性、复用性好。
5 适用于各类Web服务器(如:Unix、NT、Netscape),具有良好的通用性。
由于具有以上的优点,Perl理所当然地成为了编写CGI中最热门的语言。

一 Perl简介
Perl原来主要用于编写一些Unix系统上的管理和监控程序,由于Perl与Unix系统紧密相连,故后来很多人都喜欢采用Perl来编写 CGI 程序。现在相当一部分企业都会采用NT平台,但大部分仍然采用Perl进行应用开发。因为它具有良好的通用性和强大的字处理能力,即使以后改用Unix系统(可能由于接入用户数增多,访问量加大),程序修改量也不大(VBScript则无法移植,VBScript Windows only),故可以相信无论以后Internet server (包括Web server)的主导是NT(IIS)还是Unix(NCSA、apache...),Perl都会是炙手可热的CGI编写语言。

1 CGI基本原理
client<--->Web server<--->CGI<--->DataBase/Server File/Server Environment
当某些Web页面能够产生动态文件,让你填入表格,显示精彩动画,或是收发大型数据库信息,读取和设置各类服务器/路由器环境变量和状态,八成是利用公共网关界面,也就是所谓的 CGI(Common Gateway Interface)。
CGI本身不是一种程序语言,而是Web server与DataBase Server/其它Server之间交互作用的机制。利用CGI,软件工程师得以让Web页面可直接读取和设置各类服务器/路由器、检索各类大型数据库等。

2 使IIS(Microsoft Web Server,NT自带)支持Perl程序当你在NT上装好Perl编译程序后,需进行以下几项的设置,IIS才会支持Perl程序的调用。

1) 运行Regedt32.exe 注册表编辑器 (如果不知在哪里,可用search找)
2) 打开下面的目录(准备添加信息进该目录)
HKEY_local_machineSystemCurrentControlSetServicesW3SVCParametersScriptMap
3) 在EDIT菜单下选择‘添加数值’选项
4) '数值名称'填 .pl
5)‘数值类型’填REG_SZ
6) 按确定后,再填写‘字符串’
‘字符串’= c:perl5binperl.exe %s%s
(如果你的perl.exe文件不是位于该目录,只要填上相应路径即可。)
7) 重新起动Web Server

3 ODBC插件的安装
ODBC插件是电脑爱好者用V C 2.0编写的一个Perl for Win32的部件,相当于我们用C 编写程序时使用的类,只要定义一个属于该类的对象,就可调用它的属性和method。Perl for Win32的部件很多都是电脑爱好者编写的,使用也是免费的,如同Linix的建设一样。如果你编出一些好的部件,也可在网上公布,让更多的朋友与你分享。下面我将简单介绍一下ODBC插件的安装步骤和注意事项。

注意事项:
1)ODBC插件的版本要比Perl的版本高,也就是说ODBC插件的出版日期要迟于Perl的出版日期。建议采用ODBC插件的最新版 Win32odbc_v970208(97年2月28日出版),5.001版的Perl--110-i86(96年8月13日出版);很多人经常会装上最新版的Perl 5.003系列(97年6/7/8/9月出版),结果运行ODBC调用的程序时,就会出现以下的错误信息:'Error:Parse exception'.如果不了解情况,这确实让人非常困惑不解。
2)110-i86.zip是一个zip文件,但是download后,系统会默认为exe文件,你要把文件后缀名改为zip。
3)如果你仅想在DOS下运行程序,只需在‘我的电脑’中添加上该类型(.pl)即可。如果你想在Web上调用Perl程序,则必须在Web Server的注册表上登记,不同的Web Server上注册的方式将有少许不同,有关IIS的登记上面已作介绍。
4)如果你运行ODBC调用的程序时,出现以下的错误信息:'can't locate win32/odbc.pm in @INC ...'。这通常是你的ODBC插件没有装好,应该首先检查odbc.pm和odbc.pll是否已拷贝到相应的目录上。(后面有介绍)
5)如果需要以上的软件和帮助,可到响应的站点上查找。下面列出部分网址供大家参考。
http://202.96.151.200/zyr/
http://www.perl.hip.com/
http://www.roth.net/odbc/
ftp://ftp.linux.activeState.com/pub/Perl-Win32/

安装步骤:
1)先解开Win32odbc_v970208.zip文件,存在某个目录下。
2) 拷贝文件 libwin32odbc.pm 到 perl5libwin32 (如果你的Perl目录不是这样,作相应修改即可。)
3)在perl5libautowin32 目录下创立odbc目录。
4)拷贝文件 libautowin32odbcodbc.pll到perl5libautowin32odbcodbc.pll

4 Perl 5.0的某些语法
连接数据库后,对数据进行处理时,我们将会用到Perl 5.0的一些语句。在这里先介绍一些基础知识,对后面内容的理解将非常有帮助。
1)变量(对象)的表示方法:前面以$打头,如:$db,$bcd
2)普通阵列的表示方法:前面以@打头,如:@value
读取方式:$value[0],$value[1]...
3)相关阵列的表示方法:前面以%打头,如:%value。相关阵列与普通阵列没有什么不同,差别只在它的索引值是用字串,而非一般常用的整数值。
读取方式:$value{$string1},$value{$string2}...

二 用Perl通过ODBC创建数据库应用程序
利用ODBC类,可以十分方便地实现Web server与数据库的动态连接,在Internet/Intranet上开发出client/server结构的数据库应用程序。

1 数据库访问结构图
client<->Web Server<->CGI(perl,odbc插件)<->odbc server<->各类数据库

2 ODBC插件的数据库命令
(1)使用ODBC类
use Win32:ODBC;
当要使用ODBC类时,必须在你的程序里加入上这一行。

(2)创建ODBC的对象
$db=new Win32::ODBC("MYDSN");
接着我们要定义一个新的ODBC类的对象,这个对象与要连接的数据库的别名是相关联的;即在MYDSN处填上要连接的数据库在ODBC server(安装后放在控制面板里)中设置的别名。如果要访问的数据库需提供用户名和密码,可改用下面的格式:
$db=new Win32::ODBC("DSN=aa;UID=bb;PWD=cc;");
(其中aa填别名,bb填用户名,cc填密码)
如果你连接的是Access数据库,可采用第一种方法,因为在ODBC Server中连接Access数据库时可设置用户名和密码;如果你连接的是SQL数据库,只能采用第二种方法,因为在ODBC Server中连接SQL数据库时不能设置用户名和密码。

(3)连接数据库
$db->Connection;
连接成功时返回true,否则返回false。

(4)断开数据库连接
$db->Close();

(5)执行命令
$db->sql("sql command");
sql command 为一有效的sql语句表达式

(6)读取新一行的数据(操作对象为刚执行完sql语句后的结果)到缓冲区
$db->FetchRow();
和其他语言中的游标往下移一行同效,当刚执行完sql语句后,再执行上述语句,相当于读取第一条记录数据。

(7)把数据从缓冲区存放到变量中
($a,$b)=$db->Data("f1","f2");
($a、$b为变量,f1、f2为字段名)

(8)把数据从缓冲区存放到普通阵列中
@values=$db->Data;
(把字段值依此放入@values中)

(9)把数据从缓冲区存放到相关阵列中
%hash=db->DataHash;
(字段值可用$hash{字段名} 读取)


关于ODBC类的方法详见下表:
方法 功能 参数 备注
Catalog() 读出table信息前的设置 qualifier,owner,name,type 与TableList()连用
Connection() 连接数据库 无
Close() 关闭数据库连接 无
Data() 取数据 字段名/无
DataHash() 取数据到相关阵列 字段名/无
DataSources() 取被连接数据库的别名及相关描述 无
Drivers() 取ODBC Server的名字及相关属性 无
DumpError() 显现最后的出错环境 无 debug用
DumpData() 显现所有字段名和数据 无 debug用
Error() 显现最后的相关出错信息 无 debug用
FetchRow() 读取新一行的数据 无
FieldNames() 读取字段名 无
GetConnections 读取所有对象的连接状态 无
GetDSN() 读取连接时所用的字串 无
GetStmtCloseType() 读取当前数据库关闭类型的设置 无
GetMaxBufSize() 读取单个字段的最大字节数 无
MoreResults() 判断是否还有下一个记录 无
new() 创立新的对象 类的名称
RowCount() 返回记录数 无
Run() 运行sql语句 sql语句
SetMaxBufSize() 设置单个字段的最大字节数 变量/整数(<2G)
SetStmtCloseType() 设置当前数据库关闭类型 SQL_CLOSE/SQL_DROP/ SQL_UNBIND/SQL_RESET_PARAMS
Shutdown() 关闭ODBC连接 无 debug
Sql() 执行sql语句 sql语句  
TableList() 读出table的信息 无

三 Perl通过ODBC开发数据库应用实例
下面,我们将以一个实例来介绍如何用Perl编写一个网址查询系统。有关环境配置如下:操作系统是Windows NT Server 4.0,数据库平台为
SQL 6.5,Web Server 为IIS 2.0,ODBC Server 为ODBC 2.5,perl 的版本为5.001,odbc插件的版本为970208。



1 数据库结构 首先,假设已经存在一个名叫lookup的table供我们查询使用。它放在pub(database)中,用username="sa"、passwd=""可以访问,结构如下:
段名 属性 功能
title char(40) 网页的名称
url char(40) 网页地址
descr char(240) 网页描述信息

2 输入查询关键字(search.html)
<html>
<head>
<title>search.html</title>
</head>
<body>
<form action="http://10.240.9.30/scripts/se.pl" method="GET">
<input type="text" name="key">
</form>
</body>
</html>

注释:10.240.9.30为的Web Site地址

3 查询及返回结果(se.pl)
#header
print "HTTP/1.0 200 OKn";
print "Content-Type:text/htmlnn";

#body
use Win32::ODBC;
if (!($O= new Win32::ODBC("DSN=sql6;UID=sa;PWD=;"))){
print "Failure connection nn";
exit();
}
$O->Connection;

$String=$ENV{'QUERY_STRING'};
($Name,$Key)=split(/=/,$String);
# $key存放着查询关键字

$s_sql=join("","select * from lookup where title like'%",
$key,"%'");
$O->Sql($s_sql);

print "<HTML>n";
print "<HEAD>n";
print "<TITLE>se.pl</TITLE>n";
print "</HEAD>n";
print "<BODY>n";
print "<table>n";
while($O->FetchRow()){
%hash=$O->DataHash;
print "<tr><td align=left>$hash{title}</td>
<td><a href='$hash{url}'>$hash{descr}</a></td></tr>n";
}
$O->Close();
print "</table>n";
print "</BODY>n";
print "</HTML>n";

dawugui 2008-03-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lanjianlele1 的回复:]
我也知道要连接才行嘛,可是不知道如何用代码连接以及相关的语法才问你们的呀,能不能贴段代码嘛
[/Quote]

不同的开发语言有不同的连接方式.
你这个是C还JAVA的?
nextflying 2008-03-19
  • 打赏
  • 举报
回复
如下根据需要改改就OK
CDatabase db;
try{
CString strCon;
strCon.Format("dsn=%s;uid=%s;pwd=%s","zyoc","sa","");
db.OpenEx(strCon);
CRecordset rs(&db);
rs.Open(CRecordset::snapshot , sql);
int nColCount = rs.GetODBCFieldCount();
lanjianlele1 2008-03-19
  • 打赏
  • 举报
回复
我也知道要连接才行嘛,可是不知道如何用代码连接以及相关的语法才问你们的呀,能不能贴段代码嘛
fengyunxnc 2008-03-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hlq8210 的回复:]
能够连接上去的话,和操作本地库没有什么区别
[/Quote]

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧