Fix empty result set error handling and metadata service returning correct type name (#535)

- HandleSimpleExecuteRequest now handles the case where no rows are in a result by cleanly returning a success message but with no rows included. This is handled in the front-end instead and goes through the standard path (with a clean explanation message) instead of showing a `error: no results to return`
- MetadataService was always meant to include the type name in the return result, as otherwise the front end has to guess. In order to fix a bug where this resulted in scripting based on the metadata failing (as front-end used `Procedure` instead of `StoredProcedure`), I'm returning the data here. I'll have a matching front end fix but this is overall a good solution to have.
This commit is contained in:
Kevin Cunnane
2017-10-30 11:36:46 -07:00
committed by Karl Burtram
parent f711aaea5b
commit 185978eb80
2 changed files with 23 additions and 14 deletions

View File

@@ -184,22 +184,27 @@ namespace Microsoft.SqlTools.ServiceLayer.Metadata
var objectType = reader[2] as string; var objectType = reader[2] as string;
MetadataType metadataType; MetadataType metadataType;
string metadataTypeName;
if (objectType.StartsWith("V")) if (objectType.StartsWith("V"))
{ {
metadataType = MetadataType.View; metadataType = MetadataType.View;
metadataTypeName = "View";
} }
else if (objectType.StartsWith("P")) else if (objectType.StartsWith("P"))
{ {
metadataType = MetadataType.SProc; metadataType = MetadataType.SProc;
metadataTypeName = "StoredProcedure";
} }
else else
{ {
metadataType = MetadataType.Table; metadataType = MetadataType.Table;
metadataTypeName = "Table";
} }
metadata.Add(new ObjectMetadata metadata.Add(new ObjectMetadata
{ {
MetadataType = metadataType, MetadataType = metadataType,
MetadataTypeName = metadataTypeName,
Schema = schemaName, Schema = schemaName,
Name = objectName Name = objectName
}); });

View File

@@ -230,8 +230,7 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution
{ {
// check to make sure any results were recieved // check to make sure any results were recieved
if (query.Batches.Length == 0 if (query.Batches.Length == 0
|| query.Batches[0].ResultSets.Count == 0 || query.Batches[0].ResultSets.Count == 0)
|| query.Batches[0].ResultSets[0].RowCount == 0)
{ {
await requestContext.SendError(SR.QueryServiceResultSetHasNoResults); await requestContext.SendError(SR.QueryServiceResultSetHasNoResults);
return; return;
@@ -245,6 +244,15 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution
return; return;
} }
SimpleExecuteResult result = new SimpleExecuteResult
{
RowCount = rowCount,
ColumnInfo = query.Batches[0].ResultSets[0].Columns,
Rows = new DbCellValue[0][]
};
if (rowCount > 0)
{
SubsetParams subsetRequestParams = new SubsetParams SubsetParams subsetRequestParams = new SubsetParams
{ {
OwnerUri = randomUri, OwnerUri = randomUri,
@@ -255,12 +263,8 @@ namespace Microsoft.SqlTools.ServiceLayer.QueryExecution
}; };
// get the data to send back // get the data to send back
ResultSetSubset subset = await InterServiceResultSubset(subsetRequestParams); ResultSetSubset subset = await InterServiceResultSubset(subsetRequestParams);
SimpleExecuteResult result = new SimpleExecuteResult result.Rows = subset.Rows;
{ }
RowCount = query.Batches[0].ResultSets[0].RowCount,
ColumnInfo = query.Batches[0].ResultSets[0].Columns,
Rows = subset.Rows
};
await requestContext.SendResult(result); await requestContext.SendResult(result);
} }
finally finally