数据库|Dataset用法实践之二 C#数据层模块DLL

二。C#数据层模块DLL
在solution中新建ClassLibrary。
在新的模块中追加DataSet1.xsd。
从IDE的ServerExplorer处把需要的表托进.xsd中,这样就自动生成了相应的dataset。
这里的dataset是有类型的,还有无类型的dataset。
填充数据
{{{
MDB.Properties.Settings.Default.DBConnectionString = strConnect;
m_TableAdapterManager = new XXXDataSetTableAdapters
m_XXXDataSet = new XXXDataSet
m_TableAdapterManager.XXXTableAdapter = new XXXDataSetTableAdapters.XXXTableAdapter(); m_TableAdapterManager.XXXTableAdapter.Fill(m_XXXDataSet.XXXTable);
}}}
使用dataset
{{{
var words = m_XXXDataSet.XXXTable.AsEnumerable();
var p =
from e1 in words
where m_bXXX == true || e1.A == 1
orderby e1.B
select e1;
count = p..Distinct().Count();
p.CopyToDataTable(m_Table, LoadOption.OverwriteChanges);
}}}
遇到的问题1
强类型DataSet的大问题!无法动态修改TableAdapters的连接字符串!
你可以修改App.Config文件的ConnectStrings节,但是你会发现,在程序中建立的强类型DataTable的实际连接并没有改变。例如以前连接的是10.178.1.32的CustomTable,后来在运行时,修改App.Config配置为10.178.1.238但。修改后,在运行时打开Custom表,会发现数据还是32中的数据!
因为,在写程序的时候,我们一般都是向导生成的,这时App.Config中添加了连接字符串,VisualStudio背地里修改了与之关联的Setting.Settings文件。据说二者是一致的,修改一个,另一个会随之修改,当然这是在写程序的时候。而一旦我们编译、运行程序,就会发现App.Config如微软所说,是可以修改,也是生效的,但是Setting.Settings可是编译成了Dll的,改不了,至少是偶目前还不知道怎么改……
既然我可以修改App.Config,那么我可以修改Settings不?找了半天,找到了强类型的design.vb文件。发现里面的InitConnection()有Me._connection.ConnectionString = Global.ZgeStripMine3D.My.MySettings.Default.ConnectionString的语句,但是再一看发现My.MySettings.Default.ConnectionString是个什么玩意儿呢?ReadOnly!
查询,网上有人说:两个办法解决这个问题
1.直接修改设计器自动生成的xxx.designer.cs文件,找到xxxTableAdapter的InitConnection()方法,修改连接串,当然这样每次dataset修改后,都要再手工改下自动生成的文件。
2. 在对应的数据集源码文件(DataSetxxx.cs)文件中,修改对应的partial类。
在xxxTableAdapter对应的parital类中,另加上一个带参数的构造函数, 这个参数就是从web.config中读出来的连接串。以后调用的时候,不要直接用缺省的构造,而用这个带参数的构造就可以了。
示例代码:

C# code
{{{
namespace ClassLibrary1.DataSet1TableAdapters
{
public partial class CustomerTableAdapter
{
public CustomerTableAdapter(string connStr)
{
this._connection = new SqlConnection(connStr);
}
}
}
}}}
参见http://topic.csdn.net/u/20091221/09/83936e21-0126-46ce-8aaa-1128b16a6cb3.html
现在怎么办呢?我只能先类似
Dim TA_Ins As New DS_TDTableAdapters.TD_SEAMCODETableAdapter
‘获取最近修改过了的新的数据库连接字符串,并设置给TableAdapter!
TA_Ins.Connection.ConnectionString = clsDbHelper.GetConnectionString("ConnenctionString")
TA_Ins.Fill(DS_TD.TD_SEAMCODE)
的去解决,以便能让同时能先不耽误时间的凑合用着...
强类型,愁死人……
【数据库|Dataset用法实践之二 C#数据层模块DLL】*******************************分割线***************************

下面是某个人的解决办法:
原文名称:
DAL是通过代码生成工具自动生成的XSD强类型dataset怎么样把DAL和BLL都独立成项目。
原文链接:
http://hi.baidu.com/cxl_goto/blog/item/167ad22a77074a25d42af18e.html
内容如下:
想把DAL和BLL从项目里移出来做个类库。把DAL和BLL都独立成项目,以便同一方案可以共用。
问题是 DAL用的是通过代码生成工具自动化生成的可视化的XSD强类型dataset,数据连接字符串是web.config里的。移出去后哪里可以改数据连接。

解决方法
一般情况下,如果使用类型化数据集,在网站项目中,用到的连接字符串是保存在webconfig中的
但是如果作为单独项目的话
却是存储在Properties目录的Settings.settings内部的
展开Settings.settings可以发现有一个Settings.Designer.cs文件
格式如下
C# code
{{{
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)]
[global::System.Configuration.DefaultSettingValueAttribute("Data Source=127.0.0.1; Initial Catalog=ZKBS; User ID=sa; pwd=123")]
public string ZKBSConnectionString {
get {
return ((string)(this["ZKBSConnectionString"]));
}
}
}}}
要把强类型数据集作为单独的DAL,肯定连接字符串不能写死在程序集内部啊,想继续放到web.config中怎么办?
按照如下步骤:
把数据库名改为XXXDB,把表托到xsd文件中生成dataset。
1.在项目根目录下,新建一个Settings.settings.cs,拷贝Settings.Designer.cs的内容进来,并保存
2.把相关连接字符串部分改为如下这般
C# code
{{{
public string XXXDBConnectionString
{
get
{
//return ((string)(this["XXXDBConnectionString"]));
return System.Configuration.ConfigurationManager.AppSettings["XXXDBConnectionString"];
}
}
}}}

3.保存
4.把Properties目录的Settings.settings直接设置为"从项目中排除",不要删除,后面还有用处
这样,运行的时候就是从web.config中读取连接字符串了
需要注意的问题:
在强类型数据集设计过程中,是需要改变xsd文件还有Settings.settings相关设置的
这个时候如果Settings.settings还是处于"从项目中排除"状态的话,可能会出问题的...
所以需要将Settings.settings设置为"包含在项目中"
另外在xsd文件中,也保存着连接字符串设置,不过是指向程序集相关属性的,也就是我们上面改的地方,这里如果没有问题,最好不要手动改动,万一错了...(不过这个地方可能有挖掘的余地)

总结:
开发DAL程序集过程中,因为需要频繁变动,所以可以不用管什么连接字符串
发布的时候,执行步骤1,2,3,4
如果以后又要改动,先把Settings.settings包含进来

问题2
C#与C++之间字符串的转换问题
HOW TO:在 Visual C++ .NET 中从 System::String* 转换为 Char*
http://support.microsoft.com/kb/311259/zh-cn
Char* 转换为System::String*
LPCTSTR strConnect;
System::String^ strC = gcnew System::String(strConnect);

    推荐阅读