亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

SQL Server UDT 和存儲過程從 .Net 代碼修剪十進制數字值

SQL Server UDT 和存儲過程從 .Net 代碼修剪十進制數字值

C#
郎朗坤 2021-11-21 14:54:15
我們正在使用 .net 框架 4.7.2。我們調用一個帶有用戶定義類型變量的 sp 作為它的唯一參數。CREATE TYPE [dbo].[ABC] AS TABLE([A] [int] NOT NULL,[B] [datetime] NOT NULL,[C] [datetime] NOT NULL,[Value] [decimal](19, 6) NULL)對應的存儲過程是CREATE PROCEDURE [dbo].[myUSP]@data dbo.ABC readonly ASBEGINSET NOCOUNT ON;IF EXISTS (SELECT 1 FROM @data)BEGIN      INSERT INTO dbo.MyTable      SELECT A, B, C, [Value] FROM @data;END END我的 .Net 代碼是            using (SqlConnection con = new SqlConnection(connectionString))            {                    using (SqlCommand insertCmd = new SqlCommand("dbo.myUSP", con))                    {                        con.Open();                        using (transaction = con.BeginTransaction(IsolationLevel.RepeatableRead))                        {                            insertCmd.Transaction = transaction;                            insertCmd.CommandType = CommandType.StoredProcedure;                            try                            {                                SqlParameter parameter1 = insertCmd.Parameters.AddWithValue("@data", CreateSqlRecord(insert));                                parameter1.SqlDbType = SqlDbType.Structured;                                parameter1.TypeName = "dbo.ABC";                                insertCmd.ExecuteNonQuery();                                transaction.Commit();                            }                            catch (Exception ex)                            {                                transaction.Rollback();                            }                        }                    }            }我檢查了 parameter1 的值,然后才將其傳遞給 SQLConnection 并使用 ExecuteNonQuery 執行,并且它正確包含十進制值。另一方面,我還檢查了直接從 SQL 服務器管理工作室運行我的 sp,它在表 dbo.MyTable 中插入了正確的十進制值。BEGIN DECLARE @data dbo.ElementFactData;INSERT @data (ElementId,StartDateTime, EndDateTime, Value) VALUES(  1002, '1/1/1800' , '1/1/1900' , 0.786); exec dbo.myUSP @data;END但是,當我嘗試從 .net 代碼中插入記錄時,小于 0.5 的十進制值變為 0,而大于 0.5 的值變為 1。如 4.2 變為 4,5.87 變為 6我的 .net 代碼有什么問題嗎?
查看完整描述

1 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

我猜可能是


  metaData[3] = new SqlMetaData("Value", SqlDbType.Decimal);

需要用精度和比例指定。所以它看起來像這樣:


  metaData[3] = new SqlMetaData("Value", SqlDbType.Decimal, 19, 6);

您的 CreateSqlRecord 方法應該如下所示:


private IEnumerable<SqlDataRecord> CreateSqlRecord(IEnumerable<DataElementInput> entities)

{

    SqlMetaData[] metaData = new SqlMetaData[4];

    metaData[0] = new SqlMetaData("A", SqlDbType.Int);

    metaData[1] = new SqlMetaData("B", SqlDbType.DateTime);

    metaData[2] = new SqlMetaData("C", SqlDbType.DateTime);

    metaData[3] = new SqlMetaData("Value", SqlDbType.Decimal, 19, 6);

    SqlDataRecord record = new SqlDataRecord(metaData);

    foreach (Model myModel in entities)

    {

        record.SetInt32(0, myModel .A);

        record.SetDateTime(1,myModel.B);

        record.SetDateTime(2, myModel.C);

        record.SetDecimal(3, (Decimal)myModel.Value);

        yield return record;

    }

}


查看完整回答
反對 回復 2021-11-21
  • 1 回答
  • 0 關注
  • 204 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號