如何向SqlDataSource传递参数值

3
我正在使用SqlDataSource来填充GridView。下面是我的代码:
private void DataCall()
{
    //Object gets created for use from the class(clsDataConduit)
    clsDataDictionary AnOrder = new clsDataDictionary();
    //Declaring a new SqlDataSource from the inbuilt class library
    SqlDataSource sqlDS_ItemTable = new SqlDataSource();
    //Using our datasource object being cast onto our objects connectionstring
    sqlDS_ItemTable.ConnectionString = AnOrder.ConnectionString;
    //Our sql statement being passed through to our .SelectCommand method
    sqlDS_ItemTable.SelectCommand = "Select tblOrders.OrderId, tblItem.ItemName, tblOrders.DateOrdered from tblItem, tblOrders where tblItem.ItemId = tblOrders.ItemId AND tblOrders.AuthId = 5";
    //Adding controls to our SqlDataSource object
    this.Controls.Add(sqlDS_ItemTable);
    //Declares the DataSource for our gridview !
    grdOrder.DataSource = sqlDS_ItemTable;
    //Binds the data to refresh every time it's used
    grdOrder.DataBind();
}

正如您在 SQL 语句中看到的,我正在执行以下操作: tblOrders.AuthId = 5。但是我想要做这样的事情:tblOrders.AuthId = SessionAuthId。 我读了一些关于这样做的帖子:command.Parameters.Add(new SqlParameter("Name", dogName));,但我不知道如何将其应用到我的代码中。
我正在使用别人(教授)的代码进行分配,但我想稍微编辑一下,因为我将开发登录系统等。
有人能看一下那个方法,并看看我该如何将参数传递给它吗?此外,这是完整的代码:http://pastebin.com/sdrvW5Zn
5个回答

11
你可以使用SelectParameters属性来执行参数化查询。
sqlDS_ItemTable.SelectCommand = "Select tblOrders.OrderId, tblItem.ItemName, tblOrders.DateOrdered from tblItem, tblOrders where tblItem.ItemId = tblOrders.ItemId AND tblOrders.AuthId = @authID";

sqlDS_ItemTable.SelectParameters.Add(new SqlParameter("@authID", SessionAuthID));

当我使用这些代码时,它会突出显示SqlParameter,并表示它不是一个可用的命名空间,还会突出显示SessionAuthId,并表示它在当前上下文中不可用。 - JARRRRG

0
请使用 "SelectParameters"。这与编程有关。
sqlDS_ItemTable.SelectParameters.Clear(); 
sqlDS_ItemTable.SelectCommand = "Select tblOrders.OrderId, tblItem.ItemName, tblOrders.DateOrdered from tblItem, tblOrders where tblItem.ItemId = tblOrders.ItemId AND tblOrders.AuthId = @authID";
sqlDS_ItemTable.SelectParameters.Add("authID", SessionAuthID);

// sqlDS_ItemTable.SelectParameters.Add("stringParam",  TypeCode.String, stringParam); //like so for string validation

0
 String authId = SessionAuthID;//pass your session ID to the variable or directly you can     pass this value as the parameter value:

 string strSQL = "Select tblOrders.OrderId, tblItem.ItemName, tblOrders.DateOrdered from   tblItem, tblOrders where tblItem.ItemId = tblOrders.ItemId AND tblOrders.AuthId = @ID";
 SqlCommand cmdItem = new SqlCommand(strSQL, clsMain_Connection.openConn());
 cmdItem.Parameters.AddWithValue("@ID", authId);

0

TheGreatCO建议使用string.format方法,这看起来非常适合您当前的实现方式,其中您将SQL查询作为字符串传递。

否则,您可以从SQL片段创建存储过程,并设置该存储过程以接受参数。

我假设sessionAuthId是一个整数。

CREATE PROCEDURE SP_SAMPLEPROCEDURENAME

(
    @p1 int      -- here the input parameter is declared
)


AS
    BEGIN

Select 
tblOrders.OrderId, 
tblItem.ItemName, 
tblOrders.DateOrdered 
from tblItem, tblOrders 
where tblItem.ItemId = tblOrders.ItemId 
AND tblOrders.AuthId = @p1   -- here the input parameter is used

END

要从C#调用存储过程,您需要像这样的方法:
public YOURReturnObject PopulateGridView(int sessionid)
{

SqlConnection conn = new SqlConnection("YourDBConnectionString);
SqlCommand comm = new SqlCommand("SP_SAMPLEPROCEDURENAME", conn);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.AddWithValue("@p1",sessionid);

YOURReturnObject o = new YOURReturnObject();

using (comm.Connection)
{
comm.Connection.Open();
while (reader.Read())
{
//read the results into return object 

}

}
return o;

}

-5

使用 string.Format() http://msdn.microsoft.com/en-us/library/system.string.format.aspx

做类似这样的事情:

sqlDS_ItemTable.SelectCommand = string.Format("Select tblOrders.OrderId, tblItem.ItemName, tblOrders.DateOrdered from tblItem, tblOrders where tblItem.ItemId = tblOrders.ItemId AND tblOrders.AuthId = {0}", SessionAuthId);

回答你的第二个问题,你需要改变方法的签名来包含一个参数。
private void DataCall(string SessionAuthId)
{
    // your method here...
}

2
格式化字符串不会添加参数,最多只能让你使用一个变量。 - Dan Bracuk
@DanBracuk,这正是他想做的事情。将变量添加到SQL查询中。我提供的方法在C#端完成所有处理,而不是在SQL服务器中完成。 - Pete Garafano
@Dan Bracuk 这个方法对我很有效,而且我也理解了它。 - JARRRRG
2
@Jagga 这种方法并不被认为是“最佳实践”,它会让你面临 SQL 注入攻击的风险,但它确实更容易。你应该阅读这篇文章 http://www.codinghorror.com/blog/2005/04/give-me-parameterized-sql-or-give-me-death.html 和这篇文章 http://johnhforrest.com/2010/10/parameterized-sql-queries-in-c/。 - Pete Garafano
好的!希望到最后能使用参数化版本。 - JARRRRG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接