Как показать значение, напечатанное SQL-запросом в окне сообщения - PullRequest
8 голосов
/ 08 января 2010

Я хочу напечатать значение, возвращаемое SQL Server.

If NOT Exists(SELECT * FROM ItemList WHERE ItemName='txtItemNama') 
   BEGIN   
    INSERT INTO ItemList (ItemName) VALUES('txtItemNamea')  
   END 
ELSE  
   BEGIN 
    Print 'Duplicate' 
   END

Этот запрос либо возвращает мне количество затронутых строк, либо Duplicate

Я хочу использовать этот дубликат в C # в MessageBox.Show()

string query1 = "If NOT Exists(SELECT * FROM ItemList WHERE ItemName='txtItemName') BEGIN  INSERT INTO ItemList (ItemName) VALUES('txtItemName')  END ELSE  BEGIN Print 'Duplicate' END";
            SqlCommand cmd = new SqlCommand(query1, conn);
            SqlDataReader dr;
            conn.Open();
            dr=cmd.ExecuteReader();
            conn.Close();
MessageBox.Show(dr);

Я не знаю, как использовать dr для этого. Пожалуйста, помогите мне напечатать Дубликат здесь

MessageBox.Show (др);

Что мне здесь делать?

Ответы [ 2 ]

7 голосов
/ 01 февраля 2012

с опозданием на несколько лет, но вы сможете получить печатный / информационный текст (как первоначально просили) , прикрепив обработчик событий к событию InfoMessage объекта SqlConnection -

Но делайте это только в том случае, если вы не можете (по какой-то причине) использовать альтернативы, упомянутые в этой теме.

static void Main(string[] args)
{
    using (SqlConnection connection = new SqlConnection(@"someconnectionstring"))
    {
        connection.Open();
        using(SqlCommand command = new SqlCommand("test", connection))
        {
            connection.InfoMessage += new SqlInfoMessageEventHandler(connection_InfoMessage);
            using (SqlDataAdapter adapter = new SqlDataAdapter(command))
            {
                DataTable dt = new DataTable();
                adapter.Fill(dt); // Do something with DataTable
            }
        }
    }
}

static void connection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
    // e contains info message etc
}
1 голос
/ 08 января 2010

Используя ADO.NET, есть четыре варианта возврата информации из запроса SQL:

  • Использование объекта DataSet для сбора возвращаемых строк и работы с этими строками в дополнение к возвращаемым значениям и возвращаемым параметрам.
  • Использование объекта DataReader для сбора возвращаемых строк, перемещения по этим строкам, а также для сбора возвращаемых значений и возвращаемых параметров.
  • Используйте метод ExecuteScalar для возврата значения из первого столбца первой строки результатов с возвращаемыми значениями и возвращаемыми параметрами. Это наиболее полезно с агрегатными функциями.
  • Используйте метод ExecuteNonQuery для возврата только возвращаемых параметров и возвращаемых значений. Все возвращенные строки отбрасываются. Это наиболее полезно для выполнения запросов действий.

Это все методы, вызываемые из вашего командного объекта.

Существует множество различных способов облысения кошки, вы можете использовать выходные параметры, вы можете использовать ExecuteScalar, вы можете использовать возвращаемые значения или пустые наборы записей.

Вы должны иметь возможность что-то вроде следующего в вашем C #, чтобы получить возвращаемое значение из запроса

// add a new parameter, with any name we want - its for our own use only 
SqlParameter sqlParam = com.Parameters.Add("@ReturnValue", SqlDbType.Int); 
// set the direction flag so that it will be filled with the return value 
myParm.Direction = ParameterDirection.ReturnValue;

Код выше фиксирует возвращаемое значение, которое вы можете установить по своему усмотрению, возможно, с 0 для существует и 1 для не существует.

If NOT Exists(SELECT * FROM ItemList WHERE ItemName='txtItemNama')    
   BEGIN      
    INSERT INTO ItemList (ItemName) VALUES('txtItemNamea') 
    Return 0;    
   END    
ELSE     
   BEGIN    
    Return 1;    
   END 

Однако с приведенным выше советом есть небольшая оговорка - я обычно либо использую ORM, такой как Linq-to-SQL или NHibernate, либо использую хранимые процедуры. Я нахожу встроенный SQL довольно громоздким. Так что, хотя мой ответ в целом должен быть надежным, вам, вероятно, потребуется продумать некоторые детали, чтобы он работал именно так, как вам нужно.

...