2013-08-11 3 views
-1

У меня есть следующий код:Запуск запроса SQL Server с помощью C#

Connection c = new Connection(); 

string select1 =  
    @"SELECT 
     E.employeeNumber AS 'Employee Number', 
     E.employeePrivateName + ' ' + E.employeeFamilyName AS 'Employee Name', 
     DATEDIFF (MONTH, E.startWorkingDate, GETDATE()) AS 'Seniority in Month', 
     M.machineName AS 'Machine Name', J.jobName AS 'Job Name', 
     COUNT(E.employeeNumber) AS 'Number of Times on Machine in Specif Job', 
     SUM(Number_Of_Days_During_The_Period) AS 'Total Working Days on Machine in Specif Job', 
     SUM(Salary_per_Period) AS 'The Salary For working on Machine in Specif Job' 
    FROM 
     TblEmployee E 
    INNER JOIN 
     AllSchedules A_S on E.employeeNumber = A_S.employeeNumber 
    INNER JOIN 
     TblJob J on J.jobNumber = A_S.jobNumber 
    INNER JOIN 
     TblMachine M on M.machineNumber = A_S.machineNumber 
    INNER JOIN 
     TblPeriod P on P.Number = A_S.periodNumber 
    WHERE 
     Month(P.fromDate) = Month(@Month) 
    GROUP BY 
     E.employeeNumber, E.employeePrivateName, E.employeeFamilyName, 
     E.startWorkingDate, M.machineName, J.jobName 
    ORDER BY 
     E.employeeFamilyName , E.employeePrivateName"; 

SqlCommand cmd = new SqlCommand(select1, c.con); 
DateTime month = comboBox1.Text; 

cmd.Connection = c.con; 
cmd.Parameters.AddWithValue("@Month", month); 

SqlDataAdapter dataAdapter = new SqlDataAdapter(cmd); //c.con is the  connection string 

SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter); 

DataSet ds = new DataSet(); 
dataAdapter.Fill(ds); 

dataGridView1.ReadOnly = true; 
dataGridView1.DataSource = ds.Tables[0]; 

Я хочу, чтобы выполнить запрос, однако мне нужно определить значения даты и времени, так что это будет параметр поиска для запроса. Как сохранить переменную DateTime так, что он будет держать номер месяца (10 за октябрь, и т.д.)

Благодарности

ответ

0

Вы можете использовать

string monthString = DateTime.ParseExact(comboBox1.Text, "MMMM", CultureInfo.CurrentCulture).Month.ToString("MM"); 

и преобразовать его в целое число:

int month = int.Parse(monthString); 
0
string sMonth = DateTime.Now.ToString("MM"); 
2

В запросе у вас есть эта строка для условия WHERE

WHERE Month(P.fromDate)= Month(@Month) 

MONTH function THe из T-SQL рассчитывает получить дату его параметра, так что вам, вероятно, нужно только

DateTime dt = new DateTime(DateTime.Today.Year, month, 1); 

и передать это значение для параметра @Month

cmd.Parameters.AddWithValue("@Month", dt); 

EDIT: Если у вас есть выпадающий с элементами заполнены с названиями месяцев скомандовал: (январь, февраль ....)

// In array the indexes start at zero..... 
if(cboMonths.SelectedIndex >= 0) 
{ 
    int month = cboMonts.SelectedIndex + 1; 

} 
+0

Я хочу пользователю выбрать номер месяца из выпадающего списка и передать его в качестве параметра запроса – user2023203

+0

переменный месяц является целым справа? – Steve

+0

Да, это целое число – user2023203

0

Учитывая что функция SQL Month возвращает целое число (Source) вы должны заменить:

"... WHERE Month(P.fromDate)= Month(@Month) GROUP BY ..." 

от

"... WHERE Month(P.fromDate) = " + intMonth.ToString() + " GROUP BY ..." 

где intMonth - целочисленное значение месяца, выбранного из вашего поля.

Однако, вам необходимо убедиться, что это целое число и не может использоваться в качестве атаки на инъекции. Вам было бы лучше помещать весь ваш SQL в хранимую процедуру и передавать месяц как целочисленный параметр.

+1

Не следует ли использовать параметры для строки запроса? – Pacane

+0

@Pacane - Разве это не то, что я сказал во второй половине ответа> – ChrisF

Смежные вопросы