Sql server SQL过程返回标准查询的行,但不返回应用程序查询
这是一个奇怪的过程,我有一个程序:Sql server SQL过程返回标准查询的行,但不返回应用程序查询,sql-server,vb.net,Sql Server,Vb.net,这是一个奇怪的过程,我有一个程序: @ProjectId INT, @ChecksheetId INT, @QualId INT, @includeDeleted BIT = 0 AS BEGIN SELECT CheckSheetQual.CheckSheetQualId, CheckSheetQual.CheckSheetQualSheetId, CheckSheetQual.CheckSheetQualQualId, CheckSheetQual.CheckSheetQualPro
@ProjectId INT,
@ChecksheetId INT,
@QualId INT,
@includeDeleted BIT = 0
AS
BEGIN
SELECT CheckSheetQual.CheckSheetQualId, CheckSheetQual.CheckSheetQualSheetId, CheckSheetQual.CheckSheetQualQualId, CheckSheetQual.CheckSheetQualProjectId, CheckSheetQual.CheckSheetQualAddedById, CheckSheetQual.CheckSheetQualAddedAt,
CheckSheetQual.CheckSheetQualDeleted, CheckSheetQual.CheckSheetQualDeletedById, CheckSheetQual.CheckSheetQualDeletedAt,
Quals.QualsTitle, Quals.QualsDesc, Quals.QualsDuration, DeletedUser.UserFullName AS CheckSheetQualDeletedBy,
CheckSheetQual.CheckSheetQualAddedBy, Project.ProjectDesc, Checksheet.CheckSheetName, CheckSheetDescription, CheckSheetRevision,
Discipline.DisciplineRef, L_CheckTypeDesc
FROM dbo.[ChecksheetQual] INNER JOIN
dbo.Quals ON ChecksheetQual.CheckSheetQualQualId = Quals.QualsID INNER JOIN
dbo.Checksheet ON Checksheet.ChecksheetId = ChecksheetQual.ChecksheetQualSheetId INNER JOIN
dbo.Discipline ON Checksheet.ChecksheetDiscipline = Discipline.DisciplineId INNER JOIN
dbo.L_CheckType ON Checksheet.CheckSheetType = L_CheckType.L_CheckTypeId INNER JOIN
dbo.Project ON ChecksheetQual.ChecksheetQualProjectId = Project.ProjectId LEFT JOIN
dbo.[User] AS DeletedUser ON ChecksheetQual.CheckSheetQualDeletedById = DeletedUser.UserId
WHERE
dbo.Project.ProjectId = @ProjectId
AND
(dbo.CheckSheetQual.CheckSheetQualSheetId = @ChecksheetId)
AND
(dbo.CheckSheetQual.CheckSheetQualDeleted = @includeDeleted)
select语句是一个巨大的语句,我知道,但它可以被忽略,因为我知道它是有效的,我会告诉你为什么
现在,让我们假设我想要将includeDeleted设置为1的已删除项,因此,在sql manager中,我运行以下查询:
EXEC dbo.prc_ChecksheetQual_Get_List @ProjectId = 1, @ChecksheetId = 378, @QualId = 0, @includeDeleted = 1;
GO
结果与预期的一样,返回了正确的行,实际上有3行
现在让我们假设我想在应用程序中执行相同的操作:
Dim sqlConn As New SqlConnection(Me.Variables.ConnectionString)
Dim sqlComm As New SqlCommand
Dim sqlDR As SqlDataReader = Nothing
Try
With sqlComm
.CommandText = "prc_ChecksheetQual_Get_List"
.CommandType = CommandType.StoredProcedure
.CommandTimeout = Me.Variables.CommandTimeout
.Connection = sqlConn
.Parameters.Clear()
.Parameters.Add("@ProjectId", SqlDbType.Int).Value = 1
.Parameters.Add("@ChecksheetId", SqlDbType.Int).Value = 378
.Parameters.Add("@QualId", SqlDbType.Int).Value = 0
.Parameters.Add("@includeDeleted", SqlDbType.Bit).Value = 1
End With
If sqlConn.State <> ConnectionState.Closed Then sqlConn.Close()
sqlConn.Open()
sqlDR = sqlComm.ExecuteReader(CommandBehavior.CloseConnection)
If sqlDR.HasRows Then
list = New List(Of ChecksheetQualCLS)
While sqlDR.Read
list.Add(FillDataRecord(sqlDR))
End While
End If
返回正确的金额和正确的行。这怎么可能
我在这里完全不知所措,请帮助。检查您是否对同一数据库运行此查询。有时连接字符串很棘手是的,这当然没问题,因为正如我最后一点所说的,如果我只是将includeDeleted设置为0,那么在应用程序中一切都会按照预期工作,我有一个类似的位值参数。试试Parameters.AddNewSqlParameter@includeDeleted,SqlDbType.Bit和cmd.Parameters[@includeDeleted].Value=1,另一行。不是说您应该保持这种方式,只是测试一下这是否与我遇到的问题相同。我不想坚持,但将includeDeleted设置为0并不排除这样一个事实,即您连接到另一个数据库时,使用的行数与deleted标志的行数完全相同。您的连接字符串是什么?选中该字符串,选择正确的数据库=
.Parameters.Add("@includeDeleted", SqlDbType.Bit).Value = 0