[英]C# - Is it possible to create a Windows Forms application that can run from the command line with parameters?
[英]How can we create a dynamic sql query to run without considering if the parameters are passed or not in c# windows forms
我正在使用VS 2012和SQL Express
我正在嘗試構建Windows窗體應用程序以通過C#數據庫進行搜索,它在窗體上具有不同的控件,這些控件作為參數傳遞給查詢。
查詢中的參數不一定要傳遞幾次
我正在嘗試以下代碼示例。
SELECT a.ID AS 'DealID', a.TradeDate, c.COMPANYNAME AS 'Seller Company',
a.SellCommission, h.BROKER_FULLNAME AS 'Seller Trader',
j.DisplayName AS 'Seller Broker', d.COMPANYNAME AS 'Buyer Company',
a.BuyCommission, g.BROKER_FULLNAME AS 'Buyer Trader',
i.DisplayName AS 'Buyer Broker', e.PRODUCT_NAME, f.TYPE_DESC AS 'Quantity Type',
f.NBR_OF_GALLONS AS 'Quantity Multiplier', a.ContractVolume, a.TotalVolume,
a.DeliveryPoint, a.Price, a.ContractStart, a.ContractEnd
FROM Confirmations AS a WITH (nolock)
LEFT OUTER JOIN COMPANY AS c WITH (nolock)
ON c.COMPANY_ID = a.SellCompany
LEFT OUTER JOIN COMPANY AS d WITH (nolock)
ON d.COMPANY_ID = a.BuyCompany
LEFT OUTER JOIN BIOPRODUCTTYPES AS e WITH (nolock)
ON e.ID = a.ProductID
LEFT OUTER JOIN BIO_QUANTITY_TYPE AS f WITH (nolock)
ON f.ID = a.QuantityTypeID
LEFT OUTER JOIN COMPANYBROKER AS g WITH (nolock)
ON g.COMPANYBROKER_ID = a.BuyTrader
LEFT OUTER JOIN COMPANYBROKER AS h WITH (nolock)
ON h.COMPANYBROKER_ID = a.SellTrader
LEFT OUTER JOIN Users AS i WITH (nolock)
ON i.ID = a.BuyBroker
LEFT OUTER JOIN Users AS j WITH (nolock)
ON j.ID = a.SellBroker
WHERE (@fromdate IS NULL OR @fromdate=' ' OR a.TradeDate >= @fromdate)
AND (@todate IS NULL OR @todate=' ' OR a.TradeDate <= @todate)
AND (@buycompanyname IS NULL
OR @buycompanyname=""
OR a.BuyCompany = (SELECT COMPANY_ID
FROM COMPANY
WHERE (COMPANYNAME = @buycompanyname)))
AND (@sellcompanyname IS NULL
OR @sellcompanyname=""
OR a.SellCompany = (SELECT COMPANY_ID
FROM COMPANY
WHERE (COMPANYNAME =@sellcompanyname)))
AND (@product IS NULL OR @product="" OR e.PRODUCT_NAME= @product)";
我可以使用傳遞的參數而不是上面的查詢來動態創建查詢,這似乎更合乎邏輯,因為如果表中的列具有空值,則不查找記錄。
這就是ORM創建的目的。 通過用在運行時構建查詢的東西(例如Entity Framework或NHibernate )替換硬編碼的查詢,並為您構建查詢的SELECT
和WHERE
部分。
通過正確設置對象,您可以使用如下所示的實體框架
Nullable<DateTime> fromDate = //...
Nullable<DateTime> toDate = //...
string buyCompany = //...
//(Snip)
using(var ctx = new MyContext())
{
var query = ctx.Order;
if(fromDate.HasValue)
query = query.Where(ent=> ent.TradeDate >= fromDate.Value);
if(toDate.HasValue)
query = query.Where(ent => ent.TradeDate <= toDate.Value);
if(String.IsNullOrWhitespace(buyCompany) == false)
query = query.Where(ent => ent.BuyCompany.CompanyName = buyCompany);
//(Snip)
return query.ToList();
}
是的,只需構建您的sql查詢字符串即可。
將您的SqlCommand.CommandType
設置為CommandType.Text
然后使用SqlCommand.Parameters.AddWidthValue(string, object);
設置參數SqlCommand.Parameters.AddWidthValue(string, object);
如果要調用存儲過程,建議您動態構建SQL字符串以僅使用將要使用的參數,然后調用sp_executesql。 存儲過程如下所示:
DECLARE @sql =nvarchar(MAX), @Parameters nvarchar(max)
SET @sql = 'SELECT * FROM [dbo].[Foo] WHERE Column1 = @Param1'
SET @Parameters = '@Param1 nvarchar(32), @Param2 nvarchar(32)'
IF(@Param2 is not null and @Param2 <> ' ') SET @sql = @sql + ' AND Column2 = @Param2'
EXEC sp_executesql @Sql, @Parameters, @Param1, @Param2
如果您使用C#而不是存儲過程來構建查詢字符串,則想法基本相同:
command.CommandText = "SELECT * FROM [dbo].[Foo] WHERE Column1 = @Param1";
command.Parameters.AddWithValue("@Param1", param1);
if(!String.IsNullOrEmpty(param2))
{
command.CommandText += " AND Column2 = @Param2";
command.Parameters.AddWithValue("@Param2", param2);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.