首页 新闻 会员 周边

wcf的问题

0
悬赏园豆:100 [已解决问题] 解决于 2010-09-30 16:22

最近做一个项目遇到了一个棘手的问题,请大家帮忙一下

就是我在数据库的表中有一条数据,三个字段如下:

Name 名称,DataBase 数据库名 DataTable 表名

我把上面这张表显示给用户,如果用户点击Name,就显示相对应的表名的数据。

但是我在WCF中(用到LINQ)无法实现了,首先是返回值的问题,因为有好多表名,如果返回集合的话,不能确定返回哪个表的集合。返回的问题现在我可以用XML,现在最棘手的问题就是查询的问题,如下:

 

代码
1 /// <summary>
2 /// 取得所有的资源类别分类
3 /// </summary>
4 /// <returns></returns>
5   public string GetAllTypeCodeGroups(string strDataBase, string strDataTable)
6 {
7 try
8 {
9 MetadataDetail md = new MetadataDetail();
10
11 using (dbGRCategorySystemDataContext context = new dbGRCategorySystemDataContext())
12 {
13 List<tbCategroyStandard> lcs = context.ExecuteQuery<tbCategroyStandard>("EXEC sp_SearchMetaData @DataBase={0},@DataTable={1}", strDataBase, strDataTable).ToList<tbCategroyStandard>();
14
}
15 MemoryStream stream = new MemoryStream();
16 using (XmlDictionaryWriter writer =
17 XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8, false))
18 {
19 writer.WriteStartDocument();
20 writer.WriteElementString("SongName",
21 "urn:f",
22 "Aqualung");
23 writer.Flush();
24
25 }
26 stream.Position = 0;
27 return new StreamReader(stream).ReadToEnd();
28 }
29 catch (Exception e)
30 {
31 AccessLog.WriteLog(e.Message);
32 return null;
33 }
34 }

大家可以看一下红色的部分,那是确定的查询数据库的语句,如果现在不确定的情况下代码怎么写,因为每次不一定查询表tbCategroyStandard的值,有可能是其它表。现在我就不能解决这个问题,请大家帮忙了,在线等。帮解决的话奖励100分

天神一的主页 天神一 | 小虾三级 | 园豆:845
提问于:2010-09-29 11:00
< >
分享
最佳答案
0

你的问题就是不知道应该从那个表数据?用反射应该可以解决你的问题。 

根据你传递的参数strDataTable 来确定生成那个对象

如 ITableName tbCategroyStandard = (ITableName)Assembly.Load("你的程序集名").CreateInstance(“strDataTable”)

还有就是 红色部分换为下面的方法

IEnumerable ExecuteQuery(Type elementType, string query, params object[] parameters);

收获园豆:100
jeff-zheng | 菜鸟二级 |园豆:480 | 2010-09-29 15:41
请问一下,你的ITableName是什么类型?
天神一 | 园豆:845 (小虾三级) | 2010-09-30 09:08
参数 Type elementType 就是根据你传递的参数strDataTable 决定用那个类
jeff-zheng | 园豆:480 (菜鸟二级) | 2010-09-30 09:21
上面是反射的方法 你用 Type就行了 不用生成对象
jeff-zheng | 园豆:480 (菜鸟二级) | 2010-09-30 09:22
public static void GetAllTypeCodeGroups(string strDataBase, string strDataTable) { var tableClassName = new object(); switch (strDataTable) { case "strDataTable": { tableClassName = Assembly.Load("命名空间").CreateInstance("命名空间.类名"); break; } case "strDataTable2": { tableClassName = Assembly.Load("命名空间").CreateInstance("命名空间.类名"); break; } default: { tableClassName = Assembly.Load("命名空间").CreateInstance("命名空间.类名"); break; } } DataClasses1DataContext dataContext = new DataClasses1DataContext(); var result = dataContext.ExecuteQuery(tableClassName .GetType(), "select * from 表 , new string[] { "" }); }
jeff-zheng | 园豆:480 (菜鸟二级) | 2010-09-30 10:07
大哥,你真是太厉害了,我还想问一个问题,返回值怎么办呀,我想把查询结果返回到客户端,怎么办?
天神一 | 园豆:845 (小虾三级) | 2010-09-30 11:17
这个简单,写一个基类,基类里有你要的字段 如tableName。改写 linqtosql内容继承的你的基类。在结果进行枚举时返回内容。 foreach (var item in result ) { string a = ((BaseClass)item).tableName; }
jeff-zheng | 园豆:480 (菜鸟二级) | 2010-09-30 13:32
大哥,能不能说详细点,关键是写基类时,数据库的字段不知道呀,咱们不知道每个数据库有多少字段呀,大哥,能不能麻烦帮我写写呀
天神一 | 园豆:845 (小虾三级) | 2010-09-30 13:45
大家,给个demo可以吗?你看看我现在是这样写的,已经按照你的方法写了,现在关键方法返回值不知道怎么做了,我现在返回的是IQueryable ,但是客户端接收不到,WCF不传不确定类型的值,请你再帮帮忙 /// <summary> /// 取得原始数据 /// </summary> /// <returns></returns> public IQueryable GetAllOriginalMetaData(string strDataBase, string strDataTable) { try { var tableClassName = new object(); tableClassName = Assembly.Load("HIEG2.Entity").CreateInstance("HIEG2.Entity.ResourceCatalog." + strDataTable); using (dbGRCategorySystemDataContext context = new dbGRCategorySystemDataContext()) { var result = context.ExecuteQuery(tableClassName.GetType(), "select * from "+strDataBase+".dbo."+strDataTable,"写条件"); return result.AsQueryable(); } } catch (Exception e) { //AccessLog.WriteLog(e.Message); return null; } }
天神一 | 园豆:845 (小虾三级) | 2010-09-30 14:04
你的问题到底是什么,如果更一个DBName和TableName 去表数据。执行返回DataTable就可以了,里面有ColumnName和数据。何必要对象化。
jeff-zheng | 园豆:480 (菜鸟二级) | 2010-09-30 14:23
其实我想返回一个泛型集合,但是就是不知道怎么返回值了,不返回DataTable
天神一 | 园豆:845 (小虾三级) | 2010-09-30 14:38
如何你的表有相同字段,返回的内容又是取相同的字段则可以通过我上面的方法建立基类实现。否则, 依照你现在的步骤,可以通过把DataTable转为泛型集合返回。
jeff-zheng | 园豆:480 (菜鸟二级) | 2010-09-30 14:56
数据表的字段都不相同的,你说DataTable怎么转为泛型集合?
天神一 | 园豆:845 (小虾三级) | 2010-09-30 15:23
我说的可能不大清楚,你的问题在于你怎么用的你的方法。譬如你上面说的方法名public IQueryable GetAllOriginalMetaData(string strDataBase, string strDataTable) 你得到的结果向如何用?如果要做具体查询也要用IQueryable<T> 这个T要标识
jeff-zheng | 园豆:480 (菜鸟二级) | 2010-09-30 15:52
你有QQ不?咱们QQ上聊可以吗?
天神一 | 园豆:845 (小虾三级) | 2010-09-30 15:56
可以把你的QQ发到我的邮箱里hj888_2009@163.com
天神一 | 园豆:845 (小虾三级) | 2010-09-30 15:59
公司屏蔽QQ和MSN。jeff.zxj@gmail.com 邮箱 说清你的需求 看我能否帮助你
jeff-zheng | 园豆:480 (菜鸟二级) | 2010-09-30 16:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册