2013年12月25日 星期三

[ ASP.NET C# ] ASP.NET C# 3個執行SQL的方法說明

Reference:http://blog.xuite.net/yu928/home/34887877-ASP.NET+C%23+3%E5%80%8B%E5%9F%B7%E8%A1%8CSQL%E7%9A%84%E6%96%B9%E6%B3%95%E8%AA%AA%E6%98%8E

ExecuteNonQuery()
用法:ExecuteNonQuery用來執行INSERT、UPDATE、DELETE和其他沒有返回值得SQL命令。例如:CREATE DATABASE 和 CREATE TABLE 命令。
當使用 INSERT、UPDATE、DELETE時,ExecuteNonQuery返回被命令影響的行數。若是用在對其他命令,則返回-1。

ExecuteScalar()
用法1:ExecuteScalar 執行一個SQL命令返回結果集的第一列的第一行。它經常用來執行SQL的COUNT、AVG、MIN、MAX 和 SUM 函數,這些函數都是返回單行單列的結果集。
'注意:'ExecuteScalar 一般返回一個Object類型,因此必須把它轉換為強類型。如果轉換不正確,.NET框架就會引發 InvalidCastException異常。
 public string absentDayNo(DateTime sdate, DateTime edate, string idemp)
    { 
       string result="0";
       string myQuery="select COUNT(idemp_atd) absentDayNo from td_atd where ";
       myQuery +=" absentdate_atd between '"+sdate+"' and '"+edate+" ";
       myQuery +=" and idemp_atd='"+idemp+"' group by idemp_atd ";

       SqlCommand cmd = new SqlCommand(myQuery, conn);
       conn.Open();
//System.NullReferenceException occurs when their is no data/result
       string getValue = cmd.ExecuteScalar().ToString();
         if (getValue != null)
         {
            result = getValue.ToString();
         }
         conn.Close();
        return result;
    }
用法2:ExecuteScalar 的另一個普遍的用法是從資料庫中檢索BLOB(二進位大物件)。下面的例子從Pubs資料庫的Pub_Info表的Logo欄位中檢索圖像,並把他封裝到一個點陣圖中。
MemoryStream stream = new MemoryStream();
SqlConnection conn = new SqlConnection("連線字串");
try
{
  conn.open();
  SqlCommand cmd = new SqlCommand("SELECT logo FROM pub_info WHERE pub_id='0736'", conn);
  byte[] blob = (byte[]) cmd.ExecuteScalar();
  stream.Write(blob, 0, blob.Length);
  Bitmap bitmap = new Bitmap(stream);

  // TODO:使用點陣圖
  bitmap.Dispose();
}
catch(SqlException ex)
{
  Console.WriteLine(ex.Message);
}
finally
{
  stream.Close();
  conn.Close();
用法3:您也許對如何把BLOB寫入資料庫感興趣,答案是在包裝了INSERT命令(該命令中包含了類型為byte[]的輸入參數)的命令物件上調用ExcuteNonQuery方法。下面例子在Pubs資料庫的Pub_Info表中插入一條記錄,記錄的Logo欄位包含一個BLOB。
 
-- 定義和初始化blob變數
FileStream stream = new FileStream("Logo.jpg", FileMode.Open);
byte[] blob = new byte[stream.Length];
stream.Read(blob, 0, (int) stream.Length);
stream.Close();
SqlConnection conn = new SqlConnection("連線字串");
try
{
  conn.open();
  SqlCommand cmd = new SqlCommand("INSERT INTO pub_info(pub_id, logo) VALUES('9937', @logo)", conn);
  cmd.Parameters.Add("@logo", blob);
  cmd.ExecuteNonQuery();
}
catch(SqlException ex)
{
  Console.WriteLine(ex.Message);
}
finally
{
 stream.Close();
 conn.Close();
}
 
ExecuteReader()
用法:ExecuteReader 方法存在的目的只有一個:盡可能快地對資料庫進行查詢並得到結果。ExecuteReader 返回一個DataReader物件:如果在SqlCommand物件中調用,則返回SqlDataReader;如果在OleDbCommand物件中調用,返回的是OleDbDataReader。可以調用DataReader的方法和屬性反覆運算處理結果集。它是一個快速枚舉資料庫查詢結果的機制,是唯讀、只進的。對SqlDataReader.Read的每次調用都會從結果集中返回一行。 

沒有留言:

張貼留言