在.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