为什么 SQL 语句在对数据库执行时有效,但不能通过 WCF 工作

本文关键字:但不能 工作 WCF 有效 语句 SQL 执行 数据库 为什么 | 更新日期: 2023-09-27 18:37:01

我仍然是 .NET 的新手,我不明白为什么从应用程序到 DB 工作正常的 sql 语句现在在我尝试将其卸载到服务时不起作用。我有一个 Winform,它有一个日期、运营商和上传者复选框,根据检查的内容,sql 语句应该像应用程序与数据库对话时一样遵守它。我是否必须为每个可能的选项编写操作合同?(即日期本身、日期和承运人、日期和上传者等。谢谢!

public DataSet GetStatTableYear(StatDetails statInfo)
    {
        SqlConnection con = new SqlConnection("Data Source=localhost''sqlexpress;Initial Catalog=vurdevice;Integrated Security=True");
        con.Open();
        SqlCommand cmd = new SqlCommand(@"SELECT CONVERT(VARCHAR(4), CreateDate, 112) AS cPeriod, COUNT(DISTINCT IMEINo) AS TotalIMEINo, COUNT(*) AS TotalImageCnt, SUM(FileSize) AS TotalFileSize
                FROM VR_Image
                WHERE (@Uploader IS NULL OR Uploader = @Uploader) 
                AND (@CarrierID IS NULL OR CarrierID = @CarrierID) 
                AND DeleteDate IS NULL
                GROUP BY CONVERT(VARCHAR(4), CreateDate, 112)
                ORDER BY cPeriod", con);
        cmd.Parameters.AddWithValue("@CarrierID", statInfo.CarrierID);
        cmd.Parameters.AddWithValue("@Uploader", statInfo.Uploader);
        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        sda.Fill(ds);
        cmd.ExecuteNonQuery();
        con.Close();
        return ds;
    }

为什么 SQL 语句在对数据库执行时有效,但不能通过 WCF 工作

连接字符串中使用集成安全性,这意味着使用 Windows 身份验证建立连接。

您的 Windows 窗体应用程序在您的 Windows 帐户安全上下文下运行,并且可以连接。

除非您在 IIS 和 web.config 中启用它,否则 WCF 应用程序很可能不使用 Windows 身份验证,在这种情况下,我相信 IIS APP 池标识/帐户无法访问数据库来建立该连接。

这是我在这个阶段的最佳猜测,因为您尚未解释您收到的故障的详细信息。

我找到了一个完美运行的解决方案。由于服务一直忽略 sql 语句......

WHERE (Uploader IS NULL OR Uploader = @Uploader)
AND (CarrierID IS NULL OR CarrierID = @CarrierID)

当没有任何可用时,我为它分配了 DBNull,现在它工作正常。

新代码

public DataSet GetStatTableYear(StatDetails statInfo)
    {
        using (SqlConnection con = new SqlConnection("Data Source=localhost''sqlexpress;Initial Catalog=vurdevice;Integrated Security=True"))
        {
            con.Open();
            SqlCommand cmd = new SqlCommand(@"SELECT CONVERT(VARCHAR(4), CreateDate, 112) AS cPeriod, COUNT(DISTINCT IMEINo) AS TotalIMEINo, COUNT(*) AS TotalImageCnt, SUM(FileSize) AS TotalFileSize
                    FROM VR_Image
                    WHERE (Uploader IS NULL OR Uploader = @Uploader) 
                    AND (CarrierID IS NULL OR CarrierID = @CarrierID) 
                    AND DeleteDate IS NULL
                    GROUP BY CONVERT(VARCHAR(4), CreateDate, 112)
                    ORDER BY cPeriod", con);
            cmd.Parameters.AddWithValue("@CarrierID", statInfo.CarrierID == null ? DBNull.Value.ToString() : statInfo.CarrierID);
            cmd.Parameters.AddWithValue("@Uploader", statInfo.Uploader == null ? DBNull.Value.ToString() : statInfo.Uploader);
            SqlDataAdapter sda = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            sda.Fill(ds);
            con.Close();
            return ds;
        }
    }
相关文章: