【发布时间】:2014-10-22 10:25:36
【问题描述】:
我用 C# 编写了一个函数来从 TSQL 查询中检索结果。
public List<string> ExecuteRule(string rule)
{
List<string> foundLCNs = new List<string>();
try
{
myConnection = new SqlConnection(ConnectionString);
SqlDataReader myReader = null;
SqlCommand myCommand = new SqlCommand
(
rule,
myConnection
);
myConnection.Open();
myReader = myCommand.ExecuteReader();
while(myReader.Read())
{
foundLCNs.Add(myReader["labno"].ToString());
}
}
catch (Exception e)
{
Controller.PrintStackTrace (e);
Console.WriteLine(e.ToString());
}
finally
{
myConnection.Close();
}
return foundLCNs;
}
我发现当我运行一些 SQL 查询时,没有返回任何结果,但是,当我复制 SQL 并在 Microsoft SQL Server 管理 sudio 中运行它时,我得到了一些结果。
也许查询花费的时间太长,但我没有抛出任何异常。
当我使用调试器单步执行代码时 我打到了这条线
myReader = myCommand.ExecuteReader();
执行速度很快(检索数据需要几秒钟)。
while 循环从不执行里面的代码,它只是跳过,因为没有返回数据。
编辑
SQL 看起来像这样
WITH FilterPatches AS
(
SELECT
OIL_SAMPLE.labno
FROM OIL_SAMPLE
INNER JOIN LU_OIL_TEST_TYPE ON OIL_SAMPLE.test_type_auto = LU_OIL_TEST_TYPE.test_type_auto
LEFT JOIN OIL_EQ_UNIT ON OIL_SAMPLE.equnit_auto = OIL_EQ_UNIT.equnit_auto
LEFT JOIN Equipment ON OIL_EQ_UNIT.equipmentid_auto = Equipment.equipmentid_auto
LEFT JOIN CRSF ON Equipment.crsf_auto = CRSF.crsf_auto
LEFT JOIN CUSTOMER ON CRSF.customer_auto = CUSTOMER.customer_auto
LEFT JOIN OIL_SAMPLE_READING_STORE AS DEP ON OIL_SAMPLE.labno = DEP.labno
LEFT JOIN OIL_SAMPLE_READING AS DEP2 ON OIL_SAMPLE.labno_auto = DEP2.labno_auto
WHERE CUSTOMER.custid IN
(
'555555', '555'
) AND
(
(
DEP.element_auto IN
(
SELECT element_auto
FROM LU_OIL_ELEMENT
WHERE LU_OIL_ELEMENT.elementid = 'DEP'
)
AND
DEP.reading NOT IN ('vw', 'ok')
)
OR
(
DEP2.element_auto IN
(
SELECT element_auto
FROM LU_OIL_ELEMENT
WHERE LU_OIL_ELEMENT.elementid = 'DEP'
)
AND
DEP2.reading NOT IN ('vw', 'ok')
AND OIL_SAMPLE.data_released_date IS NULL
)
)
AND OIL_SAMPLE.labno NOT IN
(
SELECT labno
FROM OIL_SAMPLE_READING_STORE
WHERE element_auto IN
(
SELECT element_auto
FROM LU_OIL_ELEMENT
WHERE LU_OIL_ELEMENT.elementid = 'FPATCH'
)
)
AND LU_OIL_TEST_TYPE.test_type_desc NOT IN
(
'Diesel',
'DieselStd',
'DieselSml'
)
),
ParticleCountElements AS
(
SELECT element_auto
FROM LU_OIL_ELEMENT
WHERE LU_OIL_ELEMENT.elementid IN
(
'AB',
'CD'
)
)
(
SELECT labno
FROM FilterPatches
EXCEPT
(
SELECT DISTINCT labno
FROM OIL_SAMPLE_READING_STORE
WHERE element_auto IN
(
SELECT element_auto
FROM ParticleCountElements
)
AND labno IN
(
SELECT labno
FROM FilterPatches
)
AND reading_raw IS NOT NULL
UNION
SELECT labno
FROM OIL_SAMPLE
LEFT JOIN OIL_SAMPLE_READING ON OIL_SAMPLE.labno_auto = OIL_SAMPLE_READING.labno_auto
WHERE OIL_SAMPLE.data_released_date IS NULL
AND OIL_SAMPLE_READING.element_auto IN
(
SELECT element_auto
FROM ParticleCountElements
)
AND labno IN
(
SELECT labno
FROM FilterPatches
)
)
)
我已经尝试在 microsoft sql server management studio 中运行它,它运行良好。
编辑
按照建议,我已尝试将代码更改为
List<string> foundLCNs = new List<string>();
using (var cnx = new SqlConnection (ConnectionString))
{
using (SqlCommand cmd = new SqlCommand (rule, cnx))
{
cmd.CommandType = CommandType.Text;
cnx.Open ();
using (var dr = cmd.ExecuteReader())
{
if (dr.HasRows)
{
while (dr.Read ())
{
if (!dr.IsDBNull (0))
{
foundLCNs.Add (dr.GetString (0));
}
}
}
}
}
}
return foundLCNs;
HasRows 博士 是假的
我仍然得到相同的行为。它适用于其他查询,但不适用于我发布的查询。但是,此查询在 SQL Server 中运行时确实有效。
【问题讨论】:
-
你检查过执行代码的账号是否有权限查询数据库吗?
-
尝试将 CommandType 设置为 CommandType.Text
-
您的查询是什么样的?
-
@DeanOC 好想检查一下,但是 C# 函数可以很好地与其他 SQL 查询配合使用,因此它具有访问权限。
标签: c# sql-server tsql