1. 程式人生 > >ExecuteReader在執行有輸出引數的儲存過程時拿不到輸出引數

ExecuteReader在執行有輸出引數的儲存過程時拿不到輸出引數

今天一同志問我這個問題,這個是過程還原:

呼叫SQLHelper的時候發現輸出引數沒值了???

不用sqlhelper也是沒有?神馬情況?

用sqldataadapter卻可以?

嚇死寶寶了,趕緊看看啥情況。先換種方法看看

,,,我去,可以哇!那麼是不是ExecuteReader容易有啥坑的問題呢?想了想,對頭,是不是返回的reader有點問題?

先關了看看~我去,有值了!不會這麼容易就搞定了吧?不行,得再試試

~~的確,reader沒關閉,那輸出引數就沒值(其實也可以理解~reader說:本大王還沒讀取完呢,你丫急什麼,給我等著)

不能就這樣算了啊,我不能總自己寫吧,sqlhelper的問題還是得解決

我去,還是沒有。。。。。。。這可不行,看看sqlhelper的原始碼怎麼搞的

萬惡的清除啊!再試試

居然可以了,ok,收工了?來來來,我們繼續看看

SQLHelper怎麼寫的?

額,經常聽前輩說SqlDataAdapter是個神奇的東西,果然...

擴:一般很少直接返回SqlDataReader物件的,

貼一個比較弱的轉換(有更好的可以貼評論中的,我就先拋個磚頭)

public static IEnumerable<T> SqlDataReaderToList<T>(SqlDataReader reader) where T : new()
        {
            using (reader)
            {
                if (reader.HasRows)
                {
                    IList<T> list = new List<T>();
                    while (reader.Read())
                    {
                        T t = new T();
                        PropertyInfo[] propertys = t.GetType().GetProperties();
                        foreach (PropertyInfo pi in propertys)
                        {
                            string tempName = pi.Name;
                            //設定 RowFilter
                            reader.GetSchemaTable().DefaultView.RowFilter = string.Format("ColumnName='{0}'", tempName);
                            //判斷SqlDataReader是否存在某列
                            if (reader.GetSchemaTable().DefaultView.Count > 0)
                            {
                                if (!pi.CanWrite)
                                {
                                    continue;
                                }
                                var value = reader[tempName];
                                if (value != DBNull.Value)
                                {
                                    pi.SetValue(t, value, null);
                                }
                            }
                        }
                        list.Add(t);
                    }
                    return list;
                }
            }
            return null;
        }

相關推薦

ExecuteReader執行輸出引數儲存過程輸出引數

今天一同志問我這個問題,這個是過程還原: 呼叫SQLHelper的時候發現輸出引數沒值了??? 不用sqlhelper也是沒有?神馬情況? 用sqldataadapter卻可以? 嚇死寶寶了,趕緊看看啥情況。先換種方法看看 ,,,我去,可以哇!那麼是不是ExecuteRe

執行儲存過程,返回引數示例程式碼

//引數 SqlParameter[] fparams = new SqlParameter[7]; fparams[0] = new SqlParameter("@ID", ID); fparams[

T-SQL 引數儲存過程的建立與執行

1 use StudentManager 2 go 3 if exists(select * from sysobjects where name='usp_ScoreQuery2') 4 drop procedure usp_ScoreQuery2 5 go 6 --建立帶引數的儲存過程

Oracle PL/SQL 執行包裡的儲存過程 遊標輸出引數

oracle PL/SQL 如何執行包裡的儲存過程,儲存過程帶遊標輸出引數 [問題點數:40分] 收藏帖子 回覆 mjlwq 結帖率 87.5% create or replace package pkg_

在建立帶輸出引數和返回值的儲存過程---犯下的一個低階錯誤

錯誤如圖,怎麼執行都沒有自己想要的效果(return掉了,還有個啥???!!!) 處理後: if exists(select * from sysobjects where name='usp_AllPmsTest') drop proc usp_AllPmsTest go c

oracle帶輸入輸出引數儲存過程(包括sql分頁功能)

記錄一下,免得以後忘記了又要到處去找。 begin /*這裡不能直接執行select語句但可以直接執行update、delete、insert語句*/ end裡面不能接執行select語句,宣告會話級臨時表必須有“execute immediate 'TRUNCATE TABLE 表名';”這一句不然其他的s

Sql Server中儲存過程中輸入和輸出引數(簡單例項,一看就懂)

-- ===================【建立儲存過程】===================== USE [Message] GO /****** Object: StoredProcedure [dbo].[讀取外部資料庫查詢] Script Date:

使用ADO.NET物件呼叫儲存過程的輸入和輸出引數

使用ADO.NET物件 總體上,操作SQL Server的程式和操作Access的程式方法一致。只需要做3個地方的修改,就可以把操作Access資料庫的程式改成操作SQL Server的程式。 (1)修改引入的名稱空間。操作Access資料庫使用的是“System.Data.OleDb”,改成“System.

基於C#中的類SqlCommand物件呼叫SQLServer儲存過程儲存過程執行成功,但是物件方法ExecuteNonQuery()返回-1

問題如題。 【下面是一個例子】 1、儲存過程完成的功能是:插入insert一條記錄,相同主鍵的記錄存在時執行更新update的操作。儲存過程正常執行的返回值是1.(不過本文提到的問題和這個返回值沒關係。) 2、在另一個.cs檔案中使用 SqlCommand物件 呼叫方法Ex

T-SQL 帶引數儲存過程

建立帶引數的儲存過程 1 use StudentManager 2 go 3 if exists(select * from sysobjects where name='usp_ScoreQuery4') 4 drop procedure usp_ScoreQuery4 5 go 6 c

asp執行sql語句、儲存過程的幾種方法

使用connection物件 會返回一個關閉的recordset記錄集,此記錄集不要再次宣告關閉 建議在update、insert、delete時使用 strCon="provider=sqloledb;data source=servername;initial catalog

Oracle PLSQLl的多執行緒程式設計架構 儲存過程中使用多執行緒 定時任務 作業排程計劃 JOB SCHEDULE

  基於Oracle plsql的多執行緒程式設計架構 (附儲存過程) 1年前 1413 作者介紹 馮守東,北京科訊華通科技發展有限公司高階專案經理。超12年Oracle開發及管理經驗,多年運營商和政府企業級系統運維經驗,曾獲得東軟最佳設計方案獎。熟悉Weblogic、TU

java中呼叫Oracle儲存過程,出現異常:java.sql.SQLException: ORA-00928: 缺失 SELECT 關鍵字(已解決)

在java中呼叫Oracle儲存過程時,出現異常:java.sql.SQLException: ORA-00928: 缺失 SELECT 關鍵字 //java程式碼 @Test public void testProcedure(){

PL/SQL測試存在CLOB型別入參的儲存過程,入參為NULL

    今天有一儲存過程呼叫時報錯, 想dubeg下查詢問題 . 但是由於一入參為CLOB型別(如果為VARCHAR2,只支援2000長度),利用PL/SQL自身的測試功能測試時,v_doc 填入引數在執行方法是不會被傳進去,所以這個引數會為null. 測試方式:

java中使用mybatis呼叫儲存過程到返回值(單引數返回值)

service業務層呼叫dao層 注意:返回值直接從物件裡獲取 不需要拿物件接收再獲取 dao.uspGetUser(userPO);//物件封裝了儲存過程的入參和出參 count = userPO.getCount(); //count 是儲存過程的返回值 dao層介面 pu

Entity Framework Core 執行SQL語句和儲存過程

無論ORM有多麼強大,總會出現一些特殊的情況,它無法滿足我們的要求。在這篇文章中,我們介紹幾種執行SQL的方法。 表結構 在具體內容開始之前,我們先簡單說明一下要使用的表結構。 public class Category { pub

oracle pl/sql中 執行帶 OUT 的儲存過程

DECLARE V_result1 VARCHAR2(20); V_result2 VARCHAR2(20); BEGIN Proc_GetSeqence('SubtitleNo',V_res

java中呼叫儲存過程並傳遞list集合引數的方法

sql: CREATE OR REPLACE TYPE test as object( FID NUMBER,  NUM nVARCHAR2(30),  TESKID NUMBER,  CID NUMBER, USERCODE nVARCHAR2(100) ) CREA

C#中執行mysql資料庫的儲存過程

1、使用navicat建立了三個儲存過程: pro_update_ip(不帶形參) pro_insert_user(帶三個形參 textUser、textDevice、textTime 都是text型別) pro_truncate_table(帶一個形參 truncat

"伺服器無法繼續該事務 3400000006"錯誤原因--JAVA呼叫SQLSERVER儲存過程過程發生異常內部事務未提交

    通過JAVA呼叫SQLSERVER儲存過程時,儲存過程內部發生了型別轉換異常,在型別轉換異常發生之前已經將事務打開了,並且在型別轉換那一行沒有采用像如下錯誤處理:     if @@error<>0 then         goto err     e