patterncsharpMinor
Return office details from multiple tables
Viewed 0 times
tablesreturnofficedetailsmultiplefrom
Problem
The function itself is just returning as
void. But, the point of the posted code is not about what the function is returning. It is the code related to using T-SQL and C# to return data from a SQL database that I would like reviewed. Especially the way the using statements are structured.public void GetOffice(int syncID)
{
string strQry = @"
Select so.SyncID,
so.title
From Offices o
Left Outer Join SyncOffices so On so.id = o.SyncID
Where o.SyncID = @syncID
";
using (SqlConnection conn = new SqlConnection(Settings.ConnectionString))
{
using (SqlCommand objCommand = new SqlCommand(strQry, conn))
{
objCommand.CommandType = CommandType.Text;
objCommand.Parameters.AddWithValue("@syncID", syncID);
conn.Open();
SqlDataReader rdr = objCommand.ExecuteReader();
if (rdr.Read())
{
this.OfficeName= rdr.GetString(1);
}
rdr.Close();
}
}
}Solution
First of all, kudos for using a
You're not disposing all
Note:
The code assumes the query only returns 1 row, but the query isn't written to explicitly select a single row. This could lead to unexpected results.
Given some
You could then do
Finally, the T-SQL itself:
Could look like this:
Or, in a string:
The line breaks make it look weird, and since it's not too long of a query, I think it would make the code better to have it on a single line.
Parameter and not concatenating the value into your T-SQL string.You're not disposing all
IDisposable objects. SqlDataReader should be disposed as well. Now this makes it quite a bunch of nested using scopes, which you could rework like this:using (var connection = new SqlConnection(Settings.ConnectionString))
using (var command = new SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
command.Parameters.AddWithValue("@syncID", syncId);
connection.Open();
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
this.OfficeName = reader.GetString(1);
}
}
}Note:
- Usage of
varfor implicit typing makes the code easier to read (IMO), if you're using C# 3.0+
- Disemvoweling is bad. There's no reason to call a variable
rdroverreader. Use meaningful names, always.
- Hungarian notation is evil. There's no reason to prefix a
stringwithstr.
- Stick to camelCasing for locals - that includes parameters, so
syncIDbecomessyncId.
The code assumes the query only returns 1 row, but the query isn't written to explicitly select a single row. This could lead to unexpected results.
Given some
IList results = new List();:using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
results.Add(reader.GetString(1));
}
}You could then do
this.OfficeName = results.Single(); (which would blow up if no rows were returned). One thing that strikes me, is that you're selecting 2 fields, but only using 1, which makes this reader.GetString(1) statement look surprising. If you don't need to select the SyncID field, remove it from your query and do reader.GetString(0) instead.Finally, the T-SQL itself:
Select so.SyncID, so.title
From Offices o
Left Outer Join SyncOffices so On so.id = o.SyncID
Where o.SyncID = @syncIDCould look like this:
SELECT so.Title
FROM Offices o
LEFT JOIN SyncOffices so ON so.id = o.SyncID
WHERE o.SyncID = @syncIDOr, in a string:
var sql = "SELECT so.Title FROM Offices o LEFT JOIN SyncOffices so ON so.Id = o.SyncId WHERE o.SyncId = @syncId";The line breaks make it look weird, and since it's not too long of a query, I think it would make the code better to have it on a single line.
Code Snippets
using (var connection = new SqlConnection(Settings.ConnectionString))
using (var command = new SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
command.Parameters.AddWithValue("@syncID", syncId);
connection.Open();
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
this.OfficeName = reader.GetString(1);
}
}
}using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
results.Add(reader.GetString(1));
}
}Select so.SyncID, so.title
From Offices o
Left Outer Join SyncOffices so On so.id = o.SyncID
Where o.SyncID = @syncIDSELECT so.Title
FROM Offices o
LEFT JOIN SyncOffices so ON so.id = o.SyncID
WHERE o.SyncID = @syncIDvar sql = "SELECT so.Title FROM Offices o LEFT JOIN SyncOffices so ON so.Id = o.SyncId WHERE o.SyncId = @syncId";Context
StackExchange Code Review Q#41998, answer score: 8
Revisions (0)
No revisions yet.