none
有必要删除我的贴么? RRS feed

答案

  • 首先很高兴你可以继续和我讨论;D,如果你一开始把问题说清楚就好了(貌似你的帖子一开始就没有交代操作类User啥的……,你一开始的帖子只是问某个类中如何得到其UserName属性名称,还说根据指定的名称获取该属性名……所以我很纳闷:既然你要指定属性名,说明你一开始已经知道属性名称了,何必还要反射呢?呵呵)。

    其次,根据你的问题分析判断,你的目的是——根据指定属性名(映射数据库表字段的名称),以及指定的值,自动生成Where字段,对不对?

    如果我没有理解错误,你可以重写UserInfo的ToString方法,把凡是赋值的属性和内容拼接出来组成完成字符串即可。不过你还是需要手动指定哪些字段需要被映射成SQL语句,否则系统只能为所有字段生成SQL语句。

    不过可能的话,我还是建议你使用LINQ-TO-SQL或者EntityFramework,因为他们是微软定义的东西,无需你手动了。自动做映射的。

    考虑到“自动生成SQL是一个通用的模式,我特意做了一个通用的静态类,直接返回一个查询字符串供您参考:

    namespace CSharp
    {
        public class MainTest
        {
            public class UserInfo
            {
                public string UserName { set; get; }
                public int Age { set; get; }
                public DateTime Birthday { get; set; }
            }
    
            /// <summary>
            /// 统一为各类数据模型生成的模型实体类
            /// </summary>
            public static class GenericSQLGenerator
            {
                public static List<T> GetUsers<T>(T entity,string tableName,params string[]fields)where T:new()
                {
                    StringBuilder sbu = new StringBuilder();
                    sbu.Append("select * from "+tableName+" where (1=1)");
    
                    if (fields != null)
                    {
                        //遍历每一个要生成SQL的字段,取出内容
                        foreach (string field  in fields)
                        {
                            object value = entity.GetType().GetProperty(field).GetValue(entity, null);
                            if (value is int || value is double || value is decimal || value is double || value is long || value is float)
                            {
                                sbu.AppendFormat(" and ({0}={1})", field, value);
                            }
                            else if (value is DateTime)
                            {
                                sbu.AppendFormat(" and ({0}='{1}')", field, ((DateTime)value).ToString("yyyy//MM/dd"));
                            }
                            else
                            {
                                sbu.AppendFormat(" and ({0}='{1}')", field, value);
                            }
    
                        }
                    }
                    //此处执行SQL,我只是打印一个结果测试……
                    Console.WriteLine(sbu.ToString());
                    return null;
                }
    
            }
            static void Main(string[] args)
            {
                UserInfo u = new UserInfo();
                u.UserName = "张三";
                u.Age = 5;
                u.Birthday = DateTime.Now;
               GenericSQLGenerator.GetUsers<UserInfo>(u, "UserName", "Age","Birthday");
            }
        }
    }

    如果是VS2008,那么请升级到SP1,或者下载VS2010 Express:http://download.microsoft.com/download/5/c/1/5c156922-ca10-49d8-b7e7-9bf092c3b6eb/VS2010ExpressCHS.iso


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 ogra 2012年6月24日 11:23
    2012年6月24日 1:11

全部回复

  • 不好意思,本来想发在.netframework一般问题讨论的。
    2012年6月23日 9:59
  • 如果是逻辑删除,可以将帖子恢复。否则,也许大家都当我胡说。

    一直以来,这个论坛给我的帮助都很大,从中学到很多东西,但今天的事情,实在让我失望。

    2012年6月23日 10:16
  • 不是,你的问题没有说清楚。而且是你在自己没有实验的情况下一次次回复的。一般我们建议“一题一帖”。

    现在我给出你问题的一个综合方法,也希望你能够再今后描述问题能够更清楚一点:)

    public static string GetPropertyName(string properyn)
    {
       UserInfo u = new UserInfo();
       ………………
       foreach(PropertyInfo p in u.GetType().GetProperties())
       {
          if(p.Name == properyn)
           return p.Name;
       }
       return null;
    }
    
    //这样调用
    string s = GetPropertyName(pi.Name);

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月23日 10:33
  • PS:你的逻辑有问题,这个问题至少描述不清楚——

    你获取的是某个实体类的PropertyName,但是这个名称却已经可以通过PropertyInfo给出了;我不明白这个和pi.Name什么关系?如果说pi.Name包含的就是PropertyName,那么你肯定就已经预先知道了这个PropertyName,何必用反射?况且好几次你都是没有实验的……

    综合上述,你这个问题不成问题。要是可以的话,希望你在此处或者把你的代码和思路写清楚,我完全乐意服务;但是如果你只是不断地重复问题(在已经给定答案情况下),那么我只能认为你在胡搅蛮缠了。我和你无冤无仇,没有必要删除你的帖子,望以后可以注意发帖描述问题的清晰度,谢谢配合!:D


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月23日 10:37
  • 不好意思,本来想发在.netframework一般问题讨论的。
    这个应该发到C#中,确实是C#的问题……不过你不断重复,貌似你自己也不清楚到底问什么……

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月23日 10:41
  • 如果是逻辑删除,可以将帖子恢复。否则,也许大家都当我胡说。

    现在已经恢复,希望继续你的问题。并且希望一次性把问题描述清楚。或者你愿意的话,你加我QQ(点击我签名处,我们单独可以联系)

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月23日 10:58
  • 谁是谁非,翻查被删的帖子就一清二楚。
    我是来求答案,并不想跟你争辩是非。

    既然你想继续讨论,我就将前因后果说白。

    比如

    有一个User表,表中有字段UserName,Age

    有实体类

    public class UserInfo{

    public string UserName{set;get;}

    public int Age{set;get;}

    }

    有一操作类User

    public class User

    {

    public List<UserInfo> GetUsers(string strWhere)

    {

    string sql="Select UserName,Age from User where "+strWhere;

    //getUserList

    return List<UserInfo>

    }

    }

    一般调用这个查询方法时,我们会这样GetUsers("UserName='abc'");

    假如,我们已经定义了实体类字段的映射关系,那么我们就可以通过getFieldName(user.UserName),得到值"UserName"

    那么,getFieldName(user.UserName)+"='abc'" 就相当于构造了查询条件。当然,有类似user.UserName.ToString()这样简单的方法更好

    数据库的字段名因为就是实体类的属性名,所以希望得到这个字段名,构造查询语句。用这样的方法,就不需再去查询文档,看数据库表字段,也可以避免拼写错误。

    使用其他的办法当然是可以实现,但能否通过实体类自身就能获得指定的字段的名称呢?例如有类似ToString()的简单方法?

    2012年6月23日 11:26
  • 首先很高兴你可以继续和我讨论;D,如果你一开始把问题说清楚就好了(貌似你的帖子一开始就没有交代操作类User啥的……,你一开始的帖子只是问某个类中如何得到其UserName属性名称,还说根据指定的名称获取该属性名……所以我很纳闷:既然你要指定属性名,说明你一开始已经知道属性名称了,何必还要反射呢?呵呵)。

    其次,根据你的问题分析判断,你的目的是——根据指定属性名(映射数据库表字段的名称),以及指定的值,自动生成Where字段,对不对?

    如果我没有理解错误,你可以重写UserInfo的ToString方法,把凡是赋值的属性和内容拼接出来组成完成字符串即可。不过你还是需要手动指定哪些字段需要被映射成SQL语句,否则系统只能为所有字段生成SQL语句。

    不过可能的话,我还是建议你使用LINQ-TO-SQL或者EntityFramework,因为他们是微软定义的东西,无需你手动了。自动做映射的。

    考虑到“自动生成SQL是一个通用的模式,我特意做了一个通用的静态类,直接返回一个查询字符串供您参考:

    namespace CSharp
    {
        public class MainTest
        {
            public class UserInfo
            {
                public string UserName { set; get; }
                public int Age { set; get; }
                public DateTime Birthday { get; set; }
            }
    
            /// <summary>
            /// 统一为各类数据模型生成的模型实体类
            /// </summary>
            public static class GenericSQLGenerator
            {
                public static List<T> GetUsers<T>(T entity,string tableName,params string[]fields)where T:new()
                {
                    StringBuilder sbu = new StringBuilder();
                    sbu.Append("select * from "+tableName+" where (1=1)");
    
                    if (fields != null)
                    {
                        //遍历每一个要生成SQL的字段,取出内容
                        foreach (string field  in fields)
                        {
                            object value = entity.GetType().GetProperty(field).GetValue(entity, null);
                            if (value is int || value is double || value is decimal || value is double || value is long || value is float)
                            {
                                sbu.AppendFormat(" and ({0}={1})", field, value);
                            }
                            else if (value is DateTime)
                            {
                                sbu.AppendFormat(" and ({0}='{1}')", field, ((DateTime)value).ToString("yyyy//MM/dd"));
                            }
                            else
                            {
                                sbu.AppendFormat(" and ({0}='{1}')", field, value);
                            }
    
                        }
                    }
                    //此处执行SQL,我只是打印一个结果测试……
                    Console.WriteLine(sbu.ToString());
                    return null;
                }
    
            }
            static void Main(string[] args)
            {
                UserInfo u = new UserInfo();
                u.UserName = "张三";
                u.Age = 5;
                u.Birthday = DateTime.Now;
               GenericSQLGenerator.GetUsers<UserInfo>(u, "UserName", "Age","Birthday");
            }
        }
    }

    如果是VS2008,那么请升级到SP1,或者下载VS2010 Express:http://download.microsoft.com/download/5/c/1/5c156922-ca10-49d8-b7e7-9bf092c3b6eb/VS2010ExpressCHS.iso


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    • 已标记为答案 ogra 2012年6月24日 11:23
    2012年6月24日 1:11
  • 谢谢,辛苦了。
    2012年6月24日 11:24
  • 谢谢,辛苦了。

    不用谢,欢迎常来,互帮互助!

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年6月25日 0:54