在.NET Framework 2.0即以下平台下操作UDT
来源:互联网 发布:怎样开淘宝网店需要多少钱 编辑:程序博客网 时间:2024/04/30 09:52
在SQL数据库中注册了UDT(User Defined Type),要如何在ADO.NET编程中向数据库写入这种类型的数据?
查阅了MSDN的相关文档,找到这个说明:https://msdn.microsoft.com/zh-cn/library/vstudio/system.data.sqlclient.sqlparameter.udttypename%28v=vs.100%29.aspx
里面有如下的示例代码:
private static void AddSqlParameter(SqlCommand command, string udtName, Point paramValue){ SqlParameter parameter = new SqlParameter( "@Point", SqlDbType.Udt); parameter.SqlDbType = SqlDbType.Udt; parameter.UdtTypeName = udtName; parameter.Value = paramValue; command.Parameters.Add(parameter);}
但是在使用Unity操作SQL数据库进行编程时,发现SqlParameter类并没有UdtTypeName成员。后来查阅资料发现以上的用法似乎只用.NET Framework 3.5以上的版本才支持。而我在unity中使用的是mono的2.0的框架。
那要如何在2.0即以下的版本框架中写入UDT类型的数据呢?想了一个办法。
在定义UDT的编程时,给UDT结构体重写ToString()与Parse()方法。在写入与读取该UDT数据的时候,则均已字符串的形式操作。
举个例子,我自己编写了一个UDT名为SqlVector
定义如下:
[Serializable] [Microsoft.SqlServer.Server.SqlUserDefinedType(Format.Native)] public struct SqlVector : INullable { private double x, y, z; private double norm; public double X { get { return this.x; } } public double Y { get { return this.y; } } public double Z { get { return this.z; } } public double Norm { get { return this.norm; } } public SqlVector(double x, double y, double z) : this() { this.x = x; this.y = y; this.z = z; this.norm = Math.Sqrt(Math.Pow(x, 2.0f) + Math.Pow(y, 2.0f) + Math.Pow(z, 2.0f)); } public override string ToString() { return string.Format("{0}, {1}, {2}", this.x, this.y, this.z); } public bool IsNull { get { return _null; } } public static SqlVector Null { get { SqlVector h = new SqlVector(); h._null = true; return h; } } public static SqlVector Parse(SqlString s) { if (s.IsNull) return Null; string[] coordinates = s.Value.Split(','); return new SqlVector(double.Parse(coordinates[0]), double.Parse(coordinates[1]), double.Parse(coordinates[2])); } public static implicit operator SqlVector(string s) { if (string.Compare(s, "") == 0) return Null; string[] coordinates = s.Split(','); if (coordinates.Length != 3) return Null; return new SqlVector(double.Parse(coordinates[0]), double.Parse(coordinates[1]), double.Parse(coordinates[2])); } public static SqlVector operator -(SqlVector a, SqlVector b) { return new SqlVector(a.X - b.X, a.Y - b.Y, a.Z - b.Z); } public static SqlVector operator +(SqlVector a, SqlVector b) { return new SqlVector(a.X + b.X, a.Y + b.Y, a.Z + b.Z); } public static double operator *(SqlVector a, SqlVector b) { return a.X * b.X + a.Y * b.Y + a.Z * b.Z; } public static double GetAngle(SqlVector a, SqlVector b) { if(a.Norm == 0.0f || b.Norm == 0.0f) return 0.0f; return Math.Acos((a * b) / (a.Norm * b.Norm)); } // Private member private bool _null; }在向数据库写入SqlVector类型的数据时,代码片段如下:
SqlVector vector = new SqlVector(0.0f, 0.0f, 0.0f);SqlCommand cmd = new SqlCommand("NewVector", conn);//这里使用存储过程NewVector来写入数据,conn为已经构造的SqlConnection类型的变量cmd.Parameters.AddWithValue("@vector", vector.ToString());cmd.ExecuteNonQuery();
看一下结果:
不知道有没有更好的方法,求大神指点
0 0
- 在.NET Framework 2.0即以下平台下操作UDT
- CocoaPods的安装(以下命令均在终端下操作)
- 在.NET下操作INI文件
- .NET下操作注册表
- .net 下操作 Excel 文件
- 在Android下操作Excel
- 在telnet下操作memcache
- .net下操作XML的几篇文章
- .Net环境下操作IBM WebShpere MQ
- .net下操作XML的几篇文章
- .Net环境下操作IBM WebShpere MQ
- ASP.net(C#)下操作XML文件
- .net 环境下操作oracle数据库
- asp.net 在IIS下操作Excel文件权限不足的解决方法
- asp.net 在IIS下操作Excel文件权限不足的解决方法
- asp.net 在IIS下操作Excel文件权限不足的解决方法
- asp.net 在IIS下操作Excel文件权限不足的解决方法
- IE7在资源管理器下操作ftp
- 精彩百例:函数的递归调用
- 五大算法之二--动态规划
- ResultSet用法集锦
- Unity编辑器扩展之RequireComponent等详解
- HDOJ 1240 Asteroids! 【BFS+优先队列】
- 在.NET Framework 2.0即以下平台下操作UDT
- 五大算法之三--贪心算法
- quartus中引脚配置
- POJ_2481(树状数组)
- linux中用到的头文件标注
- DHCP option43之sub-option设置
- C# Code
- java抽象类
- 五大算法之四--回溯法