![]() |
1
13
不幸的是,据我所知,这个映射没有在.NET框架内的代码中公开。我以前看过.NET Framework参考源代码,发现在.NET代码中有很多长的每类型switch语句,就像您试图避免的语句一样,但它们似乎都没有对外公开。 如果您真的只想从SqlTypes映射到最有可能的.NET类型,我认为最好的办法就是简单地打开映射表 in the MSDN docs 转化为代码。请注意,MSDN上的表(至少)有两个错误:#1:没有名为“DateTime2”的.NET类型(我使用了DateTime),也没有名为“Xml”的类型(我使用了SqlXml)。 无论如何,这里是我一直在使用的映射——使用字典而不是开关,以便在没有单独方法的情况下轻松访问。
请注意,您需要注意的一件事是大小/精度——一些SQL类型(例如。
此外,由于存在已知(且较小)的类型列表,因此不必使用反射在每个类型上查找Parse()方法,您可以通过为每个类型使用强类型解析代码来获得更好的性能,如下面的代码(注意,有几种类型(例如SqlDbType.Udt)不一定有明显的解析器方法——您需要弄清楚如何处理这些类型
上面要使用的代码非常简单,例如:
|
![]() |
2
4
似乎没有人想告诉你,但你所做的可能不是最好的方式。
你是说给你一个字符串值,你知道它必须被分配给一个参数,你想把这个值以任何合适的方式塞进其中吗? 请考虑一下为什么要这样做。您假设以下代码是正确的:
但是,既然你想这么做,那么可以假设你已经尝试过了,并且发现你真正的问题是
其中,此函数将值填充到参数中。这实际上让事情变得更容易,如果
我们知道你想要的函数,但不知道为什么。在最合理的场景中,您知道值的类型,也知道参数的类型。您正在寻求一种方法,将与参数不匹配的值填充到您不理解的参数中。 对于这个请求,我可以想到两个主要原因:
对于你所处的情况,对自己诚实是非常重要的。如果是第一种情况,那么可以编写如下方法
如果你是第二种情况,停一下。认识到您正在为将来更多的bug做准备(因为转换字符串和从字符串转换不会解决您不理解类型的问题)。您知道您需要帮助,这就是为什么您处于堆栈溢出状态并提供悬赏以寻求帮助,而您正在处理一个您不理解的代码库。我现在可以从你的问题中看出,如果这是你的情况,你会给自己挖一个比你意识到的更深的洞,因为你已经没有充分的理由拒绝了最好的答案(根据参数类型执行switch语句)。 因此,如果您是在第二种情况下,最有帮助的不是堆栈溢出的答案,除非您愿意更完整地描述真正的问题。帮助您理解这些值的来源(是UI吗?它是一个不同的子系统,它们遵循哪些规则?类型不匹配有什么原因吗?)以及它们的去向(调用的存储过程的定义是什么?定义为什么样的参数类型?)。我想您甚至不需要进入SQL就可以找到它,因为给您SqlParam的人可能已经为您正确定义了它。如果您定义了它,那么确实需要立即转到SQL来解决它。 |
![]() |
3
3
我想你在这里漏了一步。您需要做的第一件事是通过select调用和sys objects表的内部联接或使用管理包装器查询数据库以获取存储过程的定义。然后,您可以根据返回的信息“推断”参数的类型。 这是一个 MSO lin 我想让你开始 how to query the database structure 直接地 如果对数据库运行第二个示例中的sql,您将看到确切的结果:
|
![]() |
4
3
你不一定 含蓄准确 你最好的选择是
测试.NET CTS类型的值类似于
|
![]() |
5
1
如果可以解析为正确的SqlType,反射将使您显式转换为.NET类型。返回值将是基础System.Type。缓存结果应该可以弥补第一次查找时的性能。 |
![]() |
6
1
linq to sql t4 ,它似乎工作得很好。
|
|
Johnny T · 基于当前值的SQL合并表[重复] 6 月前 |
![]() |
John D · 需要为NULL或NOT NULL的WHERE子句 7 月前 |
![]() |
ojek · 如何对SQL结果进行分组和编号? 7 月前 |
![]() |
senek · 如何在PL/SQL中将选择结果(列)放入数组中 7 月前 |
![]() |
Sax · 规范化Google表格(第一步) 7 月前 |
![]() |
Jatin · 检索卷计数的动态sql抛出错误语法错误[关闭] 7 月前 |
![]() |
Andrus · 如何在sql中查找第二个匹配项 7 月前 |