Как показать значение, напечатанное SQL-запросом в окне сообщения

Я хочу напечатать значение, которое возвращается 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 ответа

Решение

В 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 довольно громоздким. Так что, хотя мой ответ должен быть в целом обоснованным, вам, вероятно, придется проработать некоторые детали, чтобы заставить его работать именно так, как вам нужно.

На несколько лет позже, но вы сможете получить текст для печати / информации (как первоначально просили), прикрепив обработчик событий к событию 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
}
Другие вопросы по тегам