C# 怎样才能实现客户端通过服务器端连接数据库服务器???

各位大虾,小弟初学c#想完成一个简单的C/S程式,但发现很多实例都是通过客户端直接连接数据库,请问需要怎样才能实现 客户端通过服务器端连接数据库服务器???
实现逻辑:
客户端------服务器sever-------数据库sever
希望能够提供出示例。
请帮忙提供出具体实例代码或下载地址。

可以处理的,步骤为:
1.客户端与服务器连(用Socket通讯)
2.客户端向处服务器发送SQL语句,如搜索一个表的数据
3.服务器接到请求,执行SQL语句返回一个DataTable
4.服务器将这个DataTable进行序列化、并且压缩
5.服务器将【序列化和压缩】后的byte[] msg数组传给客户端
6.客户端收到byte[] msg数组先进行解压缩、和反序列化为DataTable
7.再将DataTable通过DataSet和SqlDataAdapter.Update(Table)存在SQL中
下面我只给一些关键的代码,我有实现过的

第一步.客户端==》连接服务器并通讯,主要是发送SQL给服务器返回一个DataTable表
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.IO.Compression;

namespace Client
{
public partial class FormClient : Form
{
DataTable dt;
public FormClient()
{
InitializeComponent();
}

private void ClientTest(string str)
{
Socket client;
String returnData;
byte[] buf = new byte[9991024]; //此处可能有些问题
//IPAddress local = IPAddress.Parse("116.25.83.127");
IPAddress local = IPAddress.Parse("127.0.0.1");//可改为远程IP地址
IPEndPoint iep = new IPEndPoint(local, 6060);
try
{
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(iep);
}
catch (SocketException)
{
Console.WriteLine("无法连接到服务器!");
return ;
}

//输入exit,可以断开与服务器的连接
if (str == "")
{
return;
}
//发送SQL语句给服务器
client.Send(Encoding.Unicode.GetBytes(str));

//得到实际收到的字节总数
Int32 rec = client.Receive(buf);
Console.WriteLine(Encoding.ASCII.GetString(buf, 0, rec));
//接收服务器返回的数据
returnData = System.Text.Encoding.Unicode.GetString(buf,0,rec);

//将returnData解压缩后,再反序列化转成DataTable dt = DeserializerDataTable(Decompress(returnData));
Console.WriteLine("断开与服务器的连接......");
client.Close();
dataGridView1.DataSource = dt;
}

//将DataTable表反序列化
private DataTable DeserializerDataTable(string pXml)
{
StringReader strReader = new StringReader(pXml);
XmlReader xmlReader = XmlReader.Create(strReader);
XmlSerializer serializer = new XmlSerializer(typeof(DataTable));
DataTable dt = serializer.Deserialize(xmlReader) as DataTable;

return dt; }
//给服务器传SQL语句
private void buttonSearch_Click(object sender, EventArgs e)
{
string Sql = String.Format("Select top {0} * From Part Where CorpCode_='PT'", textBox1.Text.Trim()); ;
ClientTest(Sql);

}
#region 压缩和解压缩
public string Compress(string str)
{
byte[] buffer = Encoding.Unicode.GetBytes(str);
MemoryStream ms = new MemoryStream();
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
{
zip.Write(buffer, 0, buffer.Length);
}
ms.Position = 0;
MemoryStream outStream = new MemoryStream();
byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);

byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return Convert.ToBase64String(gzBuffer);
}

//解压缩
public string Decompress(string compressedText)
{
byte[] gzBuffer = Convert.FromBase64String(compressedText);
using (MemoryStream ms = new MemoryStream())
{
int msgLength = BitConverter.ToInt32(gzBuffer, 0);
ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
byte[] buffer = new byte[msgLength];
ms.Position = 0;
using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
{
zip.Read(buffer, 0, buffer.Length);
}
return Encoding.Unicode.GetString(buffer);
}
}

#endregion
}
}

第二步.服务器收到SQL语句执行,并回传一个表给客户端
服务器接到请求,执行SQL语句返回一个DataTable
服务器将这个DataTable进行序列化、并且压缩
服务器将【序列化和压缩】后的byte[] msg数组传给客户端

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets; //可以使用套接字
using System.Threading; //可以使用多线程
using System.Data.SqlClient;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.IO.Compression;

namespace AppServer
{
public partial class FormApp : Form
{
public FormApp()
{
InitializeComponent();
}
private void FormApp_Load(object sender, EventArgs e)
{
// AppService instance = new AppService();
}

private void buttonStartService_Click(object sender, EventArgs e)
{
AppService();

}
private Socket server;
private Socket client;
private void AppService()
{
/*
//本机IP
string name = Dns.GetHostName();
IPHostEntry host = Dns.GetHostByName(name);
IPAddress id= host.AddressList[0];
* */

//IPAddress local = IPAddress.Parse("192.168.0.100");
IPEndPoint iep = new IPEndPoint(IPAddress.Any, 6060);
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 将套接字与本地终结点绑定
server.Bind(iep);
//在本地13000端口号上进行监听
server.Listen(10);
while (true)
{
// 得到包含客户端信息的套接字
client = server.Accept();
//创建消息服务线程对象ClientService方法委托给线程
Thread newthread = new Thread(new ThreadStart(ClientService));
// 启动消息服务线程
newthread.Start();
}
}
private Int32 i;
private void ClientService()
{
Socket s = client;
String data = null;
String returnData = null;
byte[] bytes = new byte[1024];

while ((i = s.Receive(bytes)) != 0)
{
//接收客户端的SQL
data = System.Text.Encoding.Unicode.GetString(bytes, 0, i);
//将接到的String 执行SQL返回表
DBAccess obj = new DBAccess(); //专门传给SQL的类相当于DBHELP
DataTable dt = obj.FillData(data, "TEST", 1);//执行SQL返回表

//将返回的表转为String,并将returnData压缩
returnData = obj.Compress(obj.SerializeDataTableXml(dt));
byte[] msg = System.Text.Encoding.Unicode.GetBytes(returnData);

// 发送数据表给客户端 s.Send(msg);
if ((i = s.Receive(bytes)) == 0)
continue;
}
//关闭套接字
s.Close();
}
}

//DBAccess的部份代码

class DBAccess
{
#region DataTable序列化与反序列化
public string SerializeDataTableXml(DataTable dt)
{
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);
XmlSerializer serializer = new XmlSerializer(typeof(DataTable));
serializer.Serialize(writer, dt);
writer.Close();

return sb.ToString(); }
public DataTable DeserializerDataTable(string pXml)
{
StringReader strReader = new StringReader(pXml);
XmlReader xmlReader = XmlReader.Create(strReader);
XmlSerializer serializer = new XmlSerializer(typeof(DataTable));
DataTable dt = serializer.Deserialize(xmlReader) as DataTable;

return dt; }
#endregion
#region 压缩和解压缩
public string Compress(string str)
{
byte[] buffer = Encoding.Unicode.GetBytes(str);
MemoryStream ms = new MemoryStream();
using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
{
zip.Write(buffer, 0, buffer.Length);
}
ms.Position = 0;
MemoryStream outStream = new MemoryStream();
byte[] compressed = new byte[ms.Length];
ms.Read(compressed, 0, compressed.Length);

byte[] gzBuffer = new byte[compressed.Length + 4];
System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
return Convert.ToBase64String(gzBuffer);
}

public string Decompress(string compressedText)
{
byte[] gzBuffer = Convert.FromBase64String(compressedText);
using (MemoryStream ms = new MemoryStream())
{
int msgLength = BitConverter.ToInt32(gzBuffer, 0);
ms.Write(gzBuffer, 4, gzBuffer.Length - 4);
byte[] buffer = new byte[msgLength];
ms.Position = 0;
using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
{
zip.Read(buffer, 0, buffer.Length);
}
return Encoding.Unicode.GetString(buffer);
}
}

#endregion
}

第三步.调用DataSet和SqlDataAdapter.Update(Table)存在SQL中,这个是传入一个DataGridView ,可在客户端中使用保存(部份代码,没有连接SQL数据库的)
#region 公共保存DataGridView
public bool DataGridViewSave(DataTable table,string tableName,string CorpCode)
{
string Sql = String.Format("Select Top 0 * From {0} Where CorpCode_='{1}' ", tableName, CorpCode);
SqlDataAdapter sda = new SqlDataAdapter(this.CreateCommand(Sql, null, 1));
SqlCommandBuilder scb = new SqlCommandBuilder(sda);
sda.Update(table);
this.Close();
return true;
}
#endregion
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-05
你这样的就输入分布式开发,现在流行的主要就是WCF,WebService,Remoting 服务端给出接口,客户端连接到服务器后,只需要调用服务器的方法,具体的业务操作,数据操作都是服务器来执行,如果初学建议去看下WebService相关知识,应该很容易上手本回答被提问者采纳
第2个回答  2011-05-03
那就是服务器接口客户端的sql和参数,然后服务端执行sql,把得到的结果序列化后发送出去嘛
或者使用wcf功能
第3个回答  2011-05-03
08 或之后的用wcf
像05的webservice、remoting
实例网上找找吧追问

沒有找到這方面的實例,能不能幫忙提供地址呢。

追答

你上msdn上找吧,里面好多教程的,你看你需要什么就找什么的,是在msdn的主页上,你上微软中国可以找到,找不到再MMM吧

第4个回答  2011-05-03
最简单的是使用webservice

C# 怎样才能实现客户端通过服务器端连接数据库服务器???
1.客户端与服务器连(用Socket通讯)2.客户端向处服务器发送SQL语句,如搜索一个表的数据3.服务器接到请求,执行SQL语句返回一个DataTable4.服务器将这个DataTable进行序列化、并且压缩5.服务器将【序列化和压缩】后的byte[] msg数组传给客户端6.客户端收到byte[] msg数组先进行解压缩、和反序列化为DataTable7....

自己做一个可以访问网络的C#窗体程序,怎么让别人使用我的程序也能访问...
你把要做数据服务器的电脑安装上sql server或者oracle数据库。接着在数据服务器上建表存数据;你在开发C#窗体时连接到数据库就行了。你把开发出的窗体程序安装到别人的电脑上别人也可以访问到你的数据库。不知道我这样说你能明白不~

c#编写的winform程序客户端需连接服务器的sqlserver2008数据库,客户端...
什么情况下都不需要在客户端安装sql server的。C#编写的程序,安装。net framework 就行了。

C\/S模式,C#如何远程连接sql2008数据库?
一般C\/S模式连接远程数据库是不会去直连的,而是通过一个中间系统去连接数据库。比如说你举的例子,客户端在上海,数据库在北京,那么需要在北京架一台WebService服务器(或在上海或其他城市也行,最好是在北京,与数据库在同一个内网里,但只有WebService服务器对外,而数据库服务器不对外),然后在W...

C# winform映射端口问题
客户端登录数据服务器,连接WS服务器汇报状态,这个过程其实就能实现简单的字符串口令转发,包括消息都能转发,客户端向另一个客户端或者几个客户端发送消息可以通过拼接发现消息,服务器判断一下客户端ws的id来转发消息 视频、通话、语音就不要通过服务器转发了(我所说的不是文件,文件没必要这么做,可以...

c# winform开发,客户端和服务器端如何理解
客户端,顾名思义就是给客户用的,需要简单明了,一看就知道怎么操作,通常会发送一些命令到服务器端。服务器端就是处理客户端发送的命令的,一般都是对数据库的一些操作,还有一些后台处理。

...在别人访问网站的时候获取用户的IP地址,如何实现!求高手赐教_百度知 ...
一句话搞定:Request.UserHostAddress 他得到的是一个字符串 类似于168.192.0.1。这个方法就是获取远程客户端的IP地址。

Redis C#客户端NRedisStack
连接到本地主机的 Redis 服务器,默认端口为 6379。存储和检索数据示例:存储一个简单的字符串:使用客户端执行相应的命令。 存储和获取 HashMap:通过合适的接口操作 HashMap。为了利用 Redis Stack 的功能,确保在客户端配置中正确指定集群端点。安全连接到 Redis 集群,例如,如果你的环境需要 TLS ...

什么是能力需求计划
一、数据库驱动的ERP系统体系结构本ERP系统以Web站点的形式存在于互联网上(也可以是企业的局域网),客户端利用浏览器作为输入界面,输入必要的数据,浏览器将这些数据传送至服务器网站,网站再对输入的数据进行处理,并将执行后的结果返回给浏览器,通过浏览器将最终的执行结果提交给用户。就是说客户机可以通过网络从数据...

如何使用C#实现B\/S架构软件开发
这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。客户机上只要安装一个浏览器(Browser),如Netscape Navigator或Internet Explorer,服务器安装Oracle、Sybase、Informix或SQL Server等数据库。浏览器通过Web Server同数据库进行数据交互。 这样就大大简化了客户...

相似回答