public void Search
        (
            IEnumerable <IMatchingCondition> conditions,
            IStorageDataReader responseBuilder,
            QueryOptions options
        )
        {
            DicomSqlDataAdapter dbAdapter = new DicomSqlDataAdapter(ConnectionString);
            string queryLevel             = responseBuilder.QueryLevel;
            var    cmd = dbAdapter.CreateSelectCommand(queryLevel, conditions);

            cmd.Connection.Open( );

            try
            {
                List <IDicomDataParameter> parameters = new List <IDicomDataParameter> ( );

                using (var reader = cmd.ExecuteReader( ))
                {
                    var tables            = dbAdapter.GetCurrentQueryTables( );
                    int currentTableIndex = -1;


                    do
                    {
                        currentTableIndex++;

                        responseBuilder.BeginResultSet(tables[currentTableIndex]);

                        while (reader.Read( ))
                        {
                            responseBuilder.BeginRead( );

                            for (int columnIndex = 0; columnIndex < reader.FieldCount; columnIndex++)
                            {
                                string columnName = reader.GetName(columnIndex);
                                string tableName  = tables [currentTableIndex];

                                object value = reader.GetValue(columnIndex);

                                responseBuilder.ReadData(tableName, columnName, value);
                            }

                            responseBuilder.EndRead( );
                        }

                        responseBuilder.EndResultSet( );
                    } while (reader.NextResult( ));
                }
            }
            finally
            {
                if (cmd.Connection.State == System.Data.ConnectionState.Open)
                {
                    cmd.Connection.Close( );
                }
            }

            //System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection ()
        }
        public string GetInstanceMetadata(IObjectID instance)
        {
            DicomSqlDataAdapter dbAdapter = new DicomSqlDataAdapter(ConnectionString);


            var cmd = dbAdapter.CreateGetMetadataCommand(instance);

            cmd.Connection.Open( );

            try
            {
                object result = cmd.ExecuteScalar( );

                return(result as string);
            }
            finally
            {
                cmd.Connection.Close( );
            }
        }
        public void DeleteInstance(string instance)
        {
            DicomSqlDataAdapter dbAdapter = new DicomSqlDataAdapter(ConnectionString);
            IDbCommand          cmd;

            dbAdapter.CreateConnection( );

            cmd = dbAdapter.CreateDeleteInstanceCommand(instance);

            cmd.Connection.Open( );

            try
            {
                cmd.ExecuteScalar( );
            }
            finally
            {
                cmd.Connection.Close( );
            }
        }
        public void StoreInstance(IEnumerable <IDicomDataParameter> parameters, int offset, int limit)
        {
            DicomSqlDataAdapter dbAdapter = new DicomSqlDataAdapter(ConnectionString);
            //TODO: use transation
            //dbAdapter.CreateTransation ( )

            var cmd = dbAdapter.CreateInsertCommand(parameters);

            cmd.Connection.Open( );

            try
            {
                int rowsInserted = cmd.ExecuteNonQuery( );

                if (rowsInserted <= 0)
                {
                    //return duplicate instance?!!!
                }
            }
            finally
            {
                cmd.Connection.Close( );
            }
        }
        public void StoreInstanceMetadata(IObjectID instance, string metadata)
        {
            DicomSqlDataAdapter dbAdapter = new DicomSqlDataAdapter(ConnectionString);
            //TODO: use transaction
            //dbAdapter.CreateTransaction ( )

            var cmd = dbAdapter.CreateUpdateMetadataCommand(instance, metadata);

            cmd.Connection.Open( );

            try
            {
                int rowsInserted = cmd.ExecuteNonQuery( );

                if (rowsInserted <= 0)
                {
                    //TODO: return duplicate instance?!!!
                }
            }
            finally
            {
                cmd.Connection.Close( );
            }
        }