以比较流行的ORACLE为例,它就专门为C提供了专门的编程接口.OCI(oracle call interface).让C/C++代码更高效的访问ORACLE.不用其它方的连接缓存,最大的方便C开发人员.
同样DB2、Sysbase也有其专门访问接口,方便大应用级别的访问.
因为相对比较低级,所以要学的东西很多.
(1)首先需要下载C#访问MySQL数据库的ADO.NET驱动程序下载地址为:
http://dev.mysql.com/downloads/connector/net/6.0.html
我下载的版本为: mysql-connector-net-6.3.8.msi
下载地址如下url:
http://dev.mysql.com/downloads/mirror.php?id=405442
(2)安装mysql-connector-net
然后直接在Windows *** 作系统安装 mysql-connector-net-6.3.8.msi
默认是安装在C盘:
C:\Program Files\MySQL\MySQL Connector Net 6.3.8\Assemblies
v2.0
v4.0
安装完后我选择的是v2.0版本的
然后在应用工程中引用组件MySQL.Data.dll
(3)封装数据库访问组件DbConnectionMySQL
/// <summary>
/// MySQL数据库
/// 版本 mysql-connector-net-6.3.8.msi
/// vp:hsg
/// create date:2012-02-28
/// </summary>
[Serializable]
public class DbConnectionMySQL : DbConnectionWrapper
{
public DbConnectionMySQL(string pConnectionString)
: base(pConnectionString)
{
this.m_dbconn = new MySqlConnection(pConnectionString)
this.m_DbConnState = DbConnState.Free
}
//--
public override DbDataAdapter GetDbDataAdapter()
{
return new MySqlDataAdapter()
}
public override DbDataAdapter GetDbDataAdapter(DbCommand dbCommand)
{
return new MySqlDataAdapter(dbCommand as MySqlCommand)
}
public override DbCommand GetDbCommand()
{
return new MySqlCommand()
}
public override DbConnection GetDbConnection()
{
return new MySqlConnection()
}
public override DbCommandBuilder GetDbCommandBuilder()
{
return new MySqlCommandBuilder()
}
public override DataProviderType GetCurrentDataProviderType()
{
return DataProviderType.Sql
}
public override bool IsExistsTable(string TableName, string UserName)
{
#region information
bool rbc = false //TABLES表中去查询 table_name
string dSql = "select * from TABLES where table_name='" + TableName + "'"
DataSet ds = this.ExecuteDataSet(dSql)
if (ds != null)
{
if (ds.Tables[0].Rows.Count >0)
{
rbc = true
}
else
{
rbc = false
}
}
else
{
rbc = false
}
return rbc
#endregion
}
public override bool IsExistsField(string FieldName, string TableName)
{
#region information
bool rbc = false
string dSql = ""
dSql = "select * from " + TableName + " where 1<>1"
DataSet ds = this.ExecuteDataSet(dSql)
if (ds != null)
{
DataTable dt = ds.Tables[0]
for (int j = 0j <dt.Columns.Countj++)
{
if (dt.Columns[j].ColumnName.ToString().ToUpper() == FieldName.ToString().ToUpper())
{
rbc = true
goto Return_End
}
}
dt.Dispose()
dt = null
}
ds.Dispose()
ds = null
Return_End:
return rbc
#endregion
}
public override char ParameterChar
{
get
{
return ':' //SQLite的参数符号为:
}
}
public override DbParameter CreateParameter(string name, object value)
{
return new MySqlParameter(name, value)
}
public override DbParameter CreateParameter(string name)
{
DbParameter dbp = new MySqlParameter()
dbp.ParameterName = name
return dbp
}
public override DbParameter CreateParameter(string name, DbType dbtype, object value)
{
DbParameter dbp = new MySqlParameter()
dbp.ParameterName = name
dbp.Value = value
dbp.DbType = dbtype
return dbp
}
public override DbParameter CreateParameter(string name, DbType dbtype, int size, object value)
{
DbParameter dbp = new MySqlParameter()
dbp.ParameterName = name
dbp.Value = value
dbp.DbType = dbtype
dbp.Size = size
return dbp
}
}
(4)客户端访问测试开发实例
public void TestCShape_MySQL()
{
string constr = "server=localhostUser Id=rootpassword=rootDatabase=xp_users"
DbConnectionWrapper dbw = new DbConnectionMySQL(constr)
bool rbc=dbw.TestConnection()
this.Context.Response.Write(rbc)
string x = ""
//删除语句
x = "delete from xp_users"
if (dbw.ExecuteQuery(x) >0)
{
this.Context.Response.Write("删除语句成功!下面是SQL语句<br>" + x)
}
//插入语句
x = "insert into xp_users(gid,uid,uname,sex,email,pwd) values('"
x += "1','hsg77','何XXX',1,'hsg77@163.com','1')"
if (dbw.ExecuteQuery(x) >0)
{
this.Context.Response.Write("插入语句成功!下面是SQL语句<br>"+x)
}
//查询语句
DataTable dt = dbw.ExecuteDataTable("select * from xp_users")
if (dt != null &&dt.Rows.Count >0)
{
this.Context.Response.Write("<br>用户数:"+dt.Rows.Count)
}
if (dt != null)
{
dt.Dispose()
dt = null
}
dbw.Dispose()
dbw = null
}
老大,原来你连 C 的原理都不会啊?C 语言所有调用函数,都要有声明,这种外部函数库的调用,都要用他们的 header 文件来声明函数变量等等的东西,编译器会根据实际情况去把这些程序里面的函数调用链接到函数库的正确位置上。
微软的产品因为他垄断了他自己系统的所有功能设计。所以他的系统+他的开发程序+他的开发函数库就不需要 header 文件了,因为它可以设计为 dll 本身含有足够的信息去干别的事情了。所以,你别以为你用了微软的 .net ,他就还是 C 语言了。他已经脱离了 C 语言的范围了。
GCC一般情况下是编译器,但编译器是不够的,还需要连接器的工作才行。binutils 里面的软件提供相关的功能。
要知道以前链接到函数库功能,光有 header 和函数库文件本体还是不行的,还需要另外的函数库信息文件来帮助编译器连接器来找到正确的函数入口位置才行的。
你编程 C ,你要选择你所使用的功能调用方法,GCC 一般调用 mysql 有调用外部 dll ,或者程序自己直接链接 mysql 端口,自己分析 mysql 服务进程发送的各种信息!
前一种办法,可以直接选择 mysql 客户端里面的 SDK 来直接获得官方的功能支持,但官方 MySQL 是 GPL 协议发布的,你使用他的功能接口后,你的程序也必须以 GPL 发布,不然你就要去选择其他的函数库,比如 ODBC 的 mysql 库。当然还有第三方的 mysql 功能库可以选择。
不过你要注意,LGPL 必须严格区分你的程序和 LGPL 代码。你必须动态链接到 LGPL 函数库。如果你的程序包含 LGPL 函数库一起发布,且 LGPL 库是你的软件的必备函数库,那么你的程序也必须开源,但不是 GPL 而是 LGPL !
不然你就选择自己写程序直接与 mysql 服务器进行数据传输,不使用第三方功能库。
但我不认为身为一个 Linux 下程序开发人员,会去傻傻的自己写功能函数而不是用现成的函数库。
你所遇到的“非要客户安装 mysql client ”,就是因为你的软件调用了一些非你自己编写的函数调用功能,而为了获取这些函数而需要安装几个 mysql 函数库的问题。
这个问题我想不应该是一个开发人员提出来的吧?
------------------------------------
楼主你还是重新学习 C 语言吧。.net 的 C 被微软改的不是真正的 C 语言了,所以你没办法按照 C 的标准去比较 .net 和 GCC 的。
而且很多 .net 的编程习惯也没办法延续到 GCC 的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)