我已經創建了SQL Server 2008的過程:從C#中調用存儲過程不工作
CREATE PROCEDURE USP_VISUALIZAR_PIS_PROCESSO_IMPORTACAO_DETALHE_HISTORICO
@DATA_HISTORICO DATETIME
, @SIGLA_ESTADO VARCHAR(2)
, @ANO_MES INT
, @SEMANA_MES INT
, @CODIGO_LINHA_FICTICIA INT
AS
BEGIN
SELECT P.PROD_CD_PRODUTO
, P.PROD_DS_PRODUTO
, HIST.PIDH_DT_NOTA_FISCAL
, HIST.PIDH_NR_ORDEM
, HIST.PIDH_NR_ITEM
, HIST.PIDH_CD_PROCESSO
, HIST.PIDH_DT_PREV_BOOKING
, HIST.PIDH_DT_CHEGADA_PORTO
, HIST.PIDH_DT_PREVISAO_EMBARQUE_ORDEM
, HIST.PIDH_DT_LIBERACAO
, ISNULL(HIST.PIDH_DS_CANAL, '-') AS PIDH_DS_CANAL
, HIST.PIDH_CD_REFERENCIA
, HIST.PIDH_CD_REMESSA
, HIST.PIDH_IN_FATURAS_IMPORTACAO
, HIST.PIDH_NM_FORNECEDOR
, CASE WHEN HIST.PIDH_DT_NOTA_FISCAL IS NOT NULL THEN 'Sim' ELSE 'NãO' END AS INDICADOR_RECEBIDO
, SUM(HIST.PIDH_QN_FATURA) AS PIDH_QN_FATURA
, MAX(HIST.PIDH_QN_ORDEM) AS PIDH_QN_ORDEM
, MAX(HIST.PIDH_QN_DIAS_DEMURRAGE) AS PIDH_QN_DIAS_DEMURRAGE
, CASE WHEN HIST.PIDH_DT_LIBERACAO IS NOT NULL THEN 1 ELSE 0 END AS LIBERADO
, HIST.PIDH_DT_HISTORICO
, HIST.DDT_NR_SEMANA_MES
, HIST.DDT_NR_ANOMES
FROM PROCESSO_IMPORTACAO_DETALHE_HISTORICO HIST
INNER JOIN ESTADO E ON E.ESTA_CD_ESTADO = HIST.ESTA_CD_ESTADO
INNER JOIN PRODUTO P ON P.PROD_CD_PRODUTO = HIST.PROD_CD_PRODUTO
INNER JOIN LINHA L ON L.LINH_CD_LINHA = P.LINH_CD_LINHA
INNER JOIN LINHA_FICTICIA LF ON LF.LIFI_CD_LINHA_FICTICIA = L.LIFI_CD_LINHA_FICTICIA
INNER JOIN VOLTAGEM V ON V.VOLT_CD_VOLTAGEM = P.VOLT_CD_VOLTAGEM
INNER JOIN PRODUTO_COMERCIAL PC ON PC.PRCO_CD_PRODUTO_COMERCIAL = P.PRCO_CD_PRODUTO_COMERCIAL
WHERE HIST.PIDH_DT_HISTORICO = @DATA_HISTORICO
GROUP BY P.PROD_CD_PRODUTO
, P.PROD_DS_PRODUTO
, HIST.PIDH_DT_NOTA_FISCAL
, HIST.PIDH_NR_ORDEM
, HIST.PIDH_NR_ITEM
, HIST.PIDH_CD_PROCESSO
, HIST.PIDH_DT_PREV_BOOKING
, HIST.PIDH_DT_CHEGADA_PORTO
, HIST.PIDH_DT_PREVISAO_EMBARQUE_ORDEM
, HIST.PIDH_DT_LIBERACAO
, HIST.PIDH_DS_CANAL
, HIST.PIDH_CD_REFERENCIA
, HIST.PIDH_CD_REMESSA
, HIST.PIDH_IN_FATURAS_IMPORTACAO
, HIST.PIDH_NM_FORNECEDOR
, HIST.PIDH_DT_HISTORICO
, HIST.DDT_NR_SEMANA_MES
, HIST.DDT_NR_ANOMES
END
這個程序工作正常,當我從SQL Server Management Studio中調用,但是當我從C#調用它doesn沒有工作。我需要這個程序的輸出,但我沒有成功。
的C#代碼是:
object[] o = new object[5];
o[0] = dataHistorico;
o[1] = filtro.SiglaEstado;
o[2] = filtro.AnoMes;
o[3] = filtro.SemanaMes;
o[4] = linhaFiciticia;
string query = "exec USP_VISUALIZAR_PIS_PROCESSO_IMPORTACAO_DETALHE_HISTORICO @DATA_HISTORICO = {0}, @SIGLA_ESTADO = {1}, @ANO_MES = {2}, @SEMANA_MES = {3}, @CODIGO_LINHA_FICTICIA = {4}";
var r = db.Database.ExecuteSqlCommand(query, o);
這段代碼的輸出總是-1,但是當我從SQL Server中執行它返回超過10000的記錄。
怎麼了?有人可以幫我解決這個問題嗎?
UPDATE
這裏是解決方案:
string query = "exec USP_VISUALIZAR_PIS_PROCESSO_IMPORTACAO_DETALHE_HISTORICO";
string connectionString = System.Configuration.ConfigurationSettings.AppSettings["StringConexao"].ToString();
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand command = new SqlCommand(query + " @DATA_HISTORICO = '" + dataHistorico.ToString("yyyy-MM-dd") + "', @SIGLA_ESTADO = " + filtro.SiglaEstado + ", @ANO_MES = " + filtro.AnoMes + ", @SEMANA_MES = " + filtro.SemanaMes + ", @CODIGO_LINHA_FICTICIA = " + linhaFiciticia, conn);
command.Connection.Open();
SqlDataAdapter sda = new SqlDataAdapter(command);
command.Connection.Close();
DataTable dt = new DataTable();
sda.Fill(dt);
conn.Close();
command.Connection.Close();
foreach (DataRow row in dt.Rows)
{
ProcessoImportacaoDetalhePISVO pi = new ProcessoImportacaoDetalhePISVO();
string processo = row["PIDH_CD_PROCESSO"].ToString();
string referencia = row["PIDH_CD_REFERENCIA"].ToString();
pi.Processo = !String.IsNullOrEmpty(processo) ? processo : referencia;
lista.Add(pi);
}
謝謝你們的幫助!
db.Database.ExecuteSqlCommand是做什麼的? – Arran
您是否嘗試過單獨傳遞參數? db.Database.ExecuteSqlCommand(query,dataHistorico,filtro.SiglaEstado,...) – wudzik
如果使用存儲過程,爲什麼不使用SqlCommand和SqlDataAdapter? – Tim