I have this in a public class:
SqlConnection myConnection = new SqlConnection(\"Data Source=hermes;database=qcvalues; Integrated Security=SSPI;\");
myConnect
You don't. Use a DataAdapter instead:
var ds = new DataSet();
using(var conn = new SqlConnection(connString))
{
conn.Open();
var command = new SqlCommand(InitializeQuery(), conn);
var adapter = new SqlDataAdapter(command);
adapter.Fill(ds);
}
Instead of returning a SqlDataReader, you can change your code so that it returns a DataSet.
SqlConnection myConnection = new SqlConnection("Data Source=hermes;database=qcvalues; Integrated Security=SSPI;");
DataSet dst = new DataSet();
SqlDataAdapter dap = new SqlDataAdapter(InitializeQuery(), mConnection);
dap.Fill(dst, "DataSetName");
One of the neat things about this approach is that Fill opens and closes the database connection for you.
the below snippet works fine for me on SqlServer
:
public DataSet executeProcedure(String procudureName, params SqlParameter[] sqlParameters)
{
return executeSqlCommand(procudureName, CommandType.StoredProcedure, sqlParameters);
}
public DataSet executeSql(String commandText, params SqlParameter[] sqlParameters)
{
return executeSqlCommand(commandText, CommandType.Text, sqlParameters);
}
public DataSet executeSqlCommand(String commandText, CommandType Commandtype, params SqlParameter[] sqlParameters)
{
DataSet myset = new DataSet();
using (var command = Database.GetDbConnection().CreateCommand())
{
command.CommandText = commandText;
command.CommandType = Commandtype;
foreach (var _kv in sqlParameters)
{
DbParameter _dbpara = command.CreateParameter();
_dbpara.ParameterName = _kv.ParameterName;
_dbpara.Value = _kv.Value;
command.Parameters.Add(_dbpara);
}
Database.OpenConnection();
DbDataAdapter adapter = DbProviderFactories.GetFactory(Database.GetDbConnection()).CreateDataAdapter();
adapter.SelectCommand = command;
adapter.Fill(myset);
}
return myset;
}
the DbDataAdapter
instance can be retrieved from DbProviderFactories
class.
DbDataAdapter adapter = DbProviderFactories.GetFactory(Database.GetDbConnection()).CreateDataAdapter();
if you can use DataAdapter subclass or use something as:
DataTable myTable = new DataTable();
myTable.Load(myCommand.ExecuteReader());
and then return DataTable to client.
If your SelectCommand is stored procedure, the Fill method of the adapter will rise exception.
In these cases you can use:
DataTable dt = new DataTable();
dt = sdr.GetSchemaTable();
dt.Constraints.Clear();
dt.BeginLoadData();
dt.Load(sdr);
//dt.EndLoadData(); // Enables constraints again
IDataReader reader;
DataSet ds;
while (!reader.IsClosed)
ds.Tables.Add().Load(reader);