 |
|
รบกวนหน่อยครับ คือว่าผมเขียน store procedure แล้ว ให้มัน return string ออกมาให้ แต่ตรงส่วนรับจะเขียนงัยอะครับ |
|
 |
|
|
 |
 |
|
objCmd.CommandType = CommandType.Text ; เหมือนเดิมแหละค่ะ
เอ ตัวที่เรียกเป็น scalar function หรือ store proc คะ
ถ้าเป็น scalar function return อะไรก้อได้ แต่ store proc จะ return int เท่านั้นค่ะ
จากโจทย์คุณบอกว่าเป็น string ก้อน่าจะเป็น function เรียกใช้ scalar function
ก็เรียกผ่าน SELECT ปกติค่ะ
>> SELECT [dbo].[ชื่อฟังก์ชั่น]()
ตอนรับค่ากลับเข้ามาใน .NET ก็ใช้ EXECUTESCALAR แทน EXECUTENONQUERY ค่ะ
แบบนี่
Code (C#)
object temp = objCmd.ExecuteNonQuery();
string retStr = Convert.IsDbNull( temp) ? string.Empty : temp.ToString() ;
|
 |
 |
 |
 |
Date :
2010-05-25 07:25:30 |
By :
blurEyes |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ถามต่อนิดนึงนะ
store procedure เนี่ยเขียนเป็น string ในส่วนที่เป็นโค้ดโปรแกรมได้หรือเปล่าครับ
คือไม่ชอบไปยุ่งกับฐานข้อมูลน่ะครับ
|
 |
 |
 |
 |
Date :
2010-05-25 12:00:24 |
By :
tungman |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ถามครัยคะพี่ตึ๋ง ถามเจ้าของกระทู้ป่าว เอหรือฝากถามน้องโคคะ ^ ~
|
 |
 |
 |
 |
Date :
2010-05-25 12:34:31 |
By :
blurEyes |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ถามหนูนั่นแหละจ้า
|
 |
 |
 |
 |
Date :
2010-05-25 12:42:12 |
By :
tungman |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เดวตอนเยนจะกลับมาตอบค่ะ ขออนุญาตไปเรียนก่อนค่ะ ^ ^
|
 |
 |
 |
 |
Date :
2010-05-25 12:55:21 |
By :
blurEyes |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ก่อนอื่นต้องขอประทานโทษค่ะ เป็นหวัดนิดหน่อย
ส่วนเรื่อง Store procedure มันทำได้หลายระดับ นะคะในกรณีของ database ตัวใหญ่ๆอย่าง oracle
หรือ ms sql server อันที่จริงก็ทุกตัวแหละค่ะ เริ่มๆเห็นตัว beta มาละ
ที่สามารถเขียน CLR CODE ด้วยภาษาปกตินี่แหละค่ะเพียงแต่อาจจะเปลี่ยนเรื่องการ connection
เท่านั้นเอง(*1) แล้ว compile ฝังลงไปที่ตัว database เลย
โดยจะเรียกว่าเป็น CLR Store Procedure เพราะเป็น CLR Assembly ตามปกติ
ทีนี้ถ้าจะยก STORE PROCEDURE มาเขียนที่ CODE ตอบว่าทำได้
แต่ส่วนตัวแล้วไม่คิดจะทำค่ะ เพราะเท่าที่ทราบวิธีนี้คือการ เขียน SCRIPT CREATE PROC
ส่งเข้าไปแบบ executenonquery พอใช้เสร็จก็ลบทิ้ง
คล้ายๆกับการสร้าง temp table ที่หลีกเลี่ยงให้มากเท่าที่จะทำได้
เพราะมันใช้ทรัพยากรค่อนข้างจะเยอะแล้วถ้า Control ไม่ดีไม่ถี่ถ้วนจริงในระบบที่มีผู้ใช้เยอะๆ
จะทำให้เกิดการ Crash ในบางส่วนได้ค่ะ
ถามว่าความจำเป็นในการใช้ STORE PROCEDURE มีไหม อันนี้ความเห็นส่วนตัวนะคะ
ไม่ฟันธง พี่ๆคนอื่นอาจจะไม่เห็นด้วยก็ได้ คิดว่ายังมีความจำเป็นอยู่ในระบบงานที่เริ่มๆจะซับซ้อน
ที่ต้องการความเร็วสูงๆ และความง่ายในการดูแลรักษา (เพราะปรับแก้ STORE PROC ได้เลยไม่ต้อง RECOMPILE อะไรใหม่) ถ้าเทียบกันแล้ว T-SQL จะเปรียบกับ Native code ค่ะ
ยังไงความเร็วและประสิทธิภาพก็ย่อมเหนือกว่า IL code หลายเท่า แต่ข้อจำกัดของ STORE PROC
ก็มีเยอะค่ะ เห็นก็คือถึงจะคล้ายกันแต่ก็มีบางส่วนที่ต่างกันออกไปเลยในแต่ละ database
แต่โดยปกติ site นึงๆจะใช้ฐานข้อมูลตัวเดียวอยู่แล้ว อีกเรื่องคือข้อจำกัดของตัว database manager เอง
อย่าง T-SQL นี่ Pipe ของ function Stack จะไม่เกิน 32 มั้งคะถ้าจำไม่ผิด หมายความว่า
มันจะใช้ function recursive ได้ไม่เกิน 32 ชั้น แต่ใน IL ทำได้จนกว่าทรัพยากรจะหมดแหละค่ะ
คงมีเท่านี้มั้งคะข้อดีข้อเสีย อาจะไม่ครบเพราะไม่ได้ทำงานจริงๆจังๆค่ะ
และส่วนตัวจะพยายาม hybrid ทำทั้งสองส่วนจะได้ชดเชยข้อดีข้อด้อยกันและกันค่ะ
ตอนนี้เริ่มๆ เปิดเทอมกันแล้ว คำถามเริ่มก่อตัวมาเป็นพายุ พราวก็เปิดเทอมละ
คงไม่ได้มากวนใจใครในบอร์ดนี้บ่อยๆละค่ะ พี่ตึ๋งก็เป็นโค้ชให้น้องๆนะคะ ขอบคุณค่ะ
(*1) นั่งอ่าน นั่งดู video tutorial ไปรอบนึงแล้วค่ะ ยังไม่ได้ลองปฏิบัติเพราะตอนนี้
Aim ไปที่ LINQ to SQL แทน
|
 |
 |
 |
 |
Date :
2010-05-27 08:48:48 |
By :
blurEyes |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|

อ่ออีกเรื่องนึงไปทราบเทคนิคการเขียน oop ใน c# มาอีกอย่างค่ะ
ถ้าเอาไปโพสเป็นกระทูใหม่คงไม่ค่อยมีใครสนใจ ส่วนมากจะถาม
login ทำยังไง grid ทำอย่างไร ไม่ค่อยมีใครอยากจะรุด้วยมังคะ
ไม่รุว่าพี่ตึ๋งทราบยัง ไม่รุล่ะเอาเป็นว่าให้พราวปล่อยไก่สักฟาร์มละกันนะคะ
เป็นเทคนิคการเขียน .net อีกแบบ MS เรียกว่า Method extension ที่เราจะพบใน LINQ
สังเกตุนะคะเราจะมีคำสั่งเพิ่มหลัง collection ,class ,interfece โดยที่ไม่ได้มีการไปปรับแก้อะไร
หรือไป inherit อะไรจากคลาสต้นแบบเลย
ตัวอย่างนี้เขียน 3 แบบ แบบแรกเป็นแบบที่ลองทำครั้งแรก overhead น่าจะเยอะมาก เพราะใช้ reflection
method ในตัวอย่างเป็นการ add javascript ลงไปใน web server control ผ่านทาง attributes ค่ะ
เป็นวิธีที่เรียกว่า script injection ลองดูไก่ของพราวนะคะจะกี่ฟาร์มกัน ^ ^
อันนี้ version แรกๆ
Code (C#)
public static bool AddClientScript(object varServerSideControl
, string varEventName, string varScript)
{
Type objectType = varServerSideControl.GetType();
PropertyInfo AttributesPropertyInfo = objectType.GetProperty("Attributes");
if (AttributesPropertyInfo == null) return false ; //not support 01
System.Web.UI.AttributeCollection allAttr
= AttributesPropertyInfo.GetValue(varServerSideControl, null)
as System.Web.UI.AttributeCollection;
if (allAttr == null) return false; //not support 02
allAttr.Add(varEventName, varScript);
return true;
}
usage:
Code (C#)
protected void Page_Load(object sender, EventArgs e)
{
AddClientScript ( ExpiredDateAjaxCalendar ,"onclick"
, "return expiredateValidation(this);")
.....
.....
}
ส่วน code version 2 เป็น method extension กับ Generic ค่ะ code effective ขึ้นมากๆ เลย
Code (C#)
namespace System.Web.UI.CustomExtensions
{
public static class WebControlExtension
{
/// <summary>
/// Add Some JavaScript snippet into web server control by inject with method extension feature.
/// </summary>
/// <param name="argControl"></param>
/// <param name="argClientMethodName"></param>
/// <param name="argScript"></param>
public static void AddClienScript(this System.Web.UI.WebControls.WebControl argControl
, string argClientMethodName, string argScript)
{
argControl.Attributes.Add(argClientMethodName, argScript);
}
public static void AddClienScript<T>(T argControl, string argClientMethodName, string argScript)
where T : System.Web.UI.WebControls.WebControl
{
argControl.Attributes.Add(argClientMethodName, argScript);
}
}
}
usage:
Code (C#)
using System.Web.UI.CustomExtension ;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ExpiredDateAjaxCalendar.AddClientScript ( ExpiredDateAjaxCalendar
,"onclick" , "return expiredateValidation(this);")
AddClientScript <ImageButton>(DeleteImageButton ,"onclick"
,"return confrim('Delete?');") ;
.....
.....
}
.....
.....
เท่าที่ลองใช้ดู method extension แก้ปัญหาหลายๆอย่างได้ดีมากๆค่ะ เพราะเป็น feature ที่สนุบสนุน oop
ขอบคุณมากค่ะ อ่อ นับไก่ได้กี่ตัวคะ ^ ^
|
 |
 |
 |
 |
Date :
2010-05-27 09:08:50 |
By :
blurEyes |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณครับ พอถามไปแล้ว กลับไปคิดไปคิดมา ก็รู้สึกว่าใช้งานผิดประเภทอยู่เหมือนกัน 
ซึ่งก็ทำบ่อยด้วย แต่ไม่ได้เอาไปใช้งานจริง แค่ทดลองทำเล่นว่ามันทำแบบนี้ได้ด้วย
รักษาสุขภาพด้วยครับ ช่วงนี้เริ่มเข้าหน้าฝน หวัดเดี๋ยวนี้ยิ่งแรงๆ อยู่ด้วย 
|
 |
 |
 |
 |
Date :
2010-05-27 09:25:49 |
By :
tungman |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ไม่เป็นไรแล้วค่ะนอนดึกบ่อยเจอแดดเลยกระหม่อมบาง
ปกติจะทนกว่านี้เยอะค่ะ นี่ๆ มีของฝากพี่ตึ๋งข้างบนค่ะ
|
 |
 |
 |
 |
Date :
2010-05-27 12:23:22 |
By :
blurEyes |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณครับ กะว่าจะเก็บได้อ่านและทำความเข้าใจตอนเย็นๆ น่ะครับ
|
 |
 |
 |
 |
Date :
2010-05-27 12:52:40 |
By :
tungman |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
อู้ไปนาน เพิ่งได้มาอ่าน ขอรับไปต่อยอดครับ เป็นวิธีที่ลดโค้ดไปเยอะเลย มี method เพิ่มโดย
ไม่ต้อง inherite แถมยังเพิ่มได้ทุกๆ object อีกด้วย
|
 |
 |
 |
 |
Date :
2010-06-06 12:16:33 |
By :
tungman |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เป็นการสร้าง Stored Procedure ให้ RETURN ค่า STRING ออกมานะครับ
ก่อนอื่นสร้าง TABLE กันก่อนครับ
CREATE TABLE [dbo].[tbl_test](
[test_id] [int] IDENTITY(1,1) NOT NULL,
[test_name] [nvarchar](20) NULL,
[test_pws] [nvarchar](20) NULL,
CONSTRAINT [PK_tbl_test] PRIMARY KEY CLUSTERED
(
[test_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
สร้างเพื่อใช้ในการทดสอบระบบ Login อย่างง่ายนะครับ
ถัดมาเรามาดูกานสร้าง SP กันครับ
CREATE PROCEDURE [dbo].[sp_login]
@t_id NVARCHAR(30),
@t_pw NVARCHAR(30),
@returnString NVARCHAR(30) OUTPUT
AS
Begin
SET NOCOUNT ON
DECLARE @id nvarchar(30)
DECLARE @pw nvarchar(30)
DECLARE @uid int
SET @id = @t_id
SET @pw = @t_pw
SET @returnString = ''
IF (@id = '' AND @pw = '')
BEGIN
SET @returnString = 'กรุณาระบุ ชื่อผู้ใช้ และ รหัสผ่าน'
END
ELSE IF (@id = '')
BEGIN
SET @returnString = 'กรุณาระบุ ชื่อผู้ใช้'
END
ELSE IF(@pw = '')
BEGIN
SET @returnString = 'กรุณาระบุ รหัสผ่าน'
END
ELSE
IF EXISTS(select [test_id] from tbl_test WHERE [test_name]=@id AND test_pws=@pw)
--ถูกต้อง
BEGIN
SELECT @uid = [test_id] from tbl_test WHERE [test_name]=@id AND test_pws=@pw
SET @returnString = 'เข้าสู่ระบบด้วย ' + @uid
END
ELSE
--ผิด
BEGIN
SET @returnString = 'ข้อมูลเข้าสู่ระบบไม่ถูกต้อง'
END
SET NOCOUNT OFF
End
การเรียกใช้งาน ผมลองใช้ ASP เรียกใช้งานนะครับ จะได้ แบบนี้
ASP CODE
<%
Dim m_pwd,m_id
Dim oConn, oCmd, rs,sql,returnValue
m_id=trim(request("m_id"))
m_pwd=trim(request("m_pwd"))
adCmdStoredProc = 4
adinteger = 3
adParamInput = 1
adParamOutput = 2
adParamReturnValue = 4
advarwchar=200
Set oCmd = server.createobject("adodb.command")
With oCmd
.ActiveConnection = db
.CommandType = adCmdStoredProc
.CommandText = "sp_login"
.Parameters.Append .CreateParameter("@m_id",advarwchar,adParamInput,20,m_id)
.Parameters.Append .CreateParameter("@m_pwd",advarwchar,adParamInput,20,m_pwd)
.Parameters.Append .CreateParameter("@returnString", adVarWChar, adParamOutput, 30, "")
.Execute,,adexecutenorecords
returnValue = .Parameters("@returnString").Value
End With
Set oCmd = Nothing
Response.write "RETURN VALUE : " & returnValue
response.Write "<hr />"
%>
อ่านต่อตามนี้เลยครับ
http://www.siamfocus.com/content.php?slide=10&content=181
|
 |
 |
 |
 |
Date :
2011-06-08 16:27:23 |
By :
น้องโฟ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
Code (ASP)
เป็นการสร้าง Stored Procedure ให้ RETURN ค่า STRING ออกมานะครับ
ก่อนอื่นสร้าง TABLE กันก่อนครับ
CREATE TABLE [dbo].[tbl_test](
[test_id] [int] IDENTITY(1,1) NOT NULL,
[test_name] [nvarchar](20) NULL,
[test_pws] [nvarchar](20) NULL,
CONSTRAINT [PK_tbl_test] PRIMARY KEY CLUSTERED
(
[test_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
สร้างเพื่อใช้ในการทดสอบระบบ Login อย่างง่ายนะครับ
ถัดมาเรามาดูกานสร้าง SP กันครับ
CREATE PROCEDURE [dbo].[sp_login]
@t_id NVARCHAR(30),
@t_pw NVARCHAR(30),
@returnString NVARCHAR(30) OUTPUT
AS
Begin
SET NOCOUNT ON
DECLARE @id nvarchar(30)
DECLARE @pw nvarchar(30)
DECLARE @uid int
SET @id = @t_id
SET @pw = @t_pw
SET @returnString = ''
IF (@id = '' AND @pw = '')
BEGIN
SET @returnString = 'กรุณาระบุ ชื่อผู้ใช้ และ รหัสผ่าน'
END
ELSE IF (@id = '')
BEGIN
SET @returnString = 'กรุณาระบุ ชื่อผู้ใช้'
END
ELSE IF(@pw = '')
BEGIN
SET @returnString = 'กรุณาระบุ รหัสผ่าน'
END
ELSE
IF EXISTS(select [test_id] from tbl_test WHERE [test_name]=@id AND test_pws=@pw)
--ถูกต้อง
BEGIN
SELECT @uid = [test_id] from tbl_test WHERE [test_name]=@id AND test_pws=@pw
SET @returnString = 'เข้าสู่ระบบด้วย ' + @uid
END
ELSE
--ผิด
BEGIN
SET @returnString = 'ข้อมูลเข้าสู่ระบบไม่ถูกต้อง'
END
SET NOCOUNT OFF
End
การเรียกใช้งาน ผมลองใช้ ASP เรียกใช้งานนะครับ จะได้ แบบนี้
ASP CODE
<%
Dim m_pwd,m_id
Dim oConn, oCmd, rs,sql,returnValue
m_id=trim(request("m_id"))
m_pwd=trim(request("m_pwd"))
adCmdStoredProc = 4
adinteger = 3
adParamInput = 1
adParamOutput = 2
adParamReturnValue = 4
advarwchar=200
Set oCmd = server.createobject("adodb.command")
With oCmd
.ActiveConnection = db
.CommandType = adCmdStoredProc
.CommandText = "sp_login"
.Parameters.Append .CreateParameter("@m_id",advarwchar,adParamInput,20,m_id)
.Parameters.Append .CreateParameter("@m_pwd",advarwchar,adParamInput,20,m_pwd)
.Parameters.Append .CreateParameter("@returnString", adVarWChar, adParamOutput, 30, "")
.Execute,,adexecutenorecords
returnValue = .Parameters("@returnString").Value
End With
Set oCmd = Nothing
Response.write "RETURN VALUE : " & returnValue
response.Write "<hr />"
%>
อ่านต่อตรงนี้นะครับ
http://www.siamfocus.com/content.php?slide=10&content=181
|
 |
 |
 |
 |
Date :
2011-06-08 16:28:48 |
By :
focus |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณที่แนะนำให้รู้จัก Extension Method
วันนี้เลยไปลองหาดู โชคดีที่ VB ก็มีด้วย
รู้สึกว่า Feature นี้เริ่มมีตั้งแต่ VS2008
|
 |
 |
 |
 |
Date :
2011-06-09 09:23:31 |
By :
watcharop |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|