Выберите с помощью ExecuteScalar (), не работающей, когда я использую переменную, всегда возвращаю пустую, когда я не использую переменную, она работает - C# - PullRequest
0 голосов
/ 16 февраля 2020

Когда я использую переменную, результат command.ExecuteScalar() всегда пуст (пуст), я не получаю никаких сообщений об ошибках, просто пустое значение, но когда я использую тот же SQL запрос без использования переменной это работает.

То, что я пробовал до сих пор:

//variable @num is a long and contais the value = '8131818060'              

string teste = num.ToString();


// 1º: In this case ip value: it's empty

string sql = @"select Sites_IP_Rede from tblRamais where E164 = '" + teste + "'";

command = new SqlCommand(sql, con.conectar());
var ip = (string)command.ExecuteScalar();
con.desconectar();
MessageBox.Show("IP Value: " + ip);


// 2º: In this case ip value: it's empty

string sql = @"select Sites_IP_Rede from tblRamais where E164 = " + teste;

command = new SqlCommand(sql, con.conectar());
var ip = (string)command.ExecuteScalar();
con.desconectar();
MessageBox.Show("IP Value: " + ip);


// 3º: In this case ip value: it's empty

string sql = @"select Sites_IP_Rede from tblRamais where E164 = " + num";

command = new SqlCommand(sql, con.conectar());
var ip = (string)command.ExecuteScalar();
con.desconectar();
MessageBox.Show("IP Value: " + ip);


// 4º In this case ip value: it's empty

string sql = @"select Sites_IP_Rede from tblRamais where E164 = @e164";

SqlCommand command = new SqlCommand(sql, con.conectar());
command.Parameters.Clear();
command.Parameters.AddWithValue("@e164", teste);

//string ip = command.ExecuteScalar() as string;
var ip = (string)command.ExecuteScalar();

MessageBox.Show("IP Value:: " + ip);
con.desconectar();


// 5º In this case ip value: it's empty

string sql = @"select Sites_IP_Rede from tblRamais where E164 = @e164";

SqlCommand command = new SqlCommand(sql, con.conectar());
command.Parameters.Add(new SqlParameter
{
    ParameterName = "@e164",
    Value = teste,
}
);

//string ip = command.ExecuteScalar() as string;
var ip = (string)command.ExecuteScalar();

MessageBox.Show("IP Value: " + ip);
con.desconectar();


//6º This one it's the only way it works
// That's the only way it works, When i write the parameter = "8131818060"

string sql = "select Sites_IP_Rede from tblRamais where E164 = 8131818060";

SqlCommand command = new SqlCommand(sql, con.conectar());

string IP = (string)command.ExecuteScalar();

MessageBox.Show("IP Value: " + IP);

//The ip values in this case is "10.101.1.0"

E164 - это nvarchar (10)

Я сделал тест, и результат 1 верен, так что teste равен "8131818060", но result2 равен false, "sql" не равен "sql2"

        bool result1 = string.Equals(teste,"8131818060");





        string sql = "select Sites_IP_Rede from tblRamais where E164 = 8131818060";


        string sql2 = "select Sites_IP_Rede from tblRamais where E164 = " + teste;


        bool result2 = string.Equals(sql,"sql2");

// по предложению Roeland // Я проверял таким образом, и я получение ошибки NullReferenceException для ip.ToString () //System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта

         //num is a long variable pass from the user

         string sql = @"select Sites_IP_Rede from tblRamais where E164 = '" + num.ToString() + "'";
         SqlCommand command = new SqlCommand(sql, con.conectar());
         var ip = command.ExecuteScalar();
         con.desconectar();
         MessageBox.Show("IP Value: " + ip.ToString());

1 Ответ

1 голос
/ 16 февраля 2020

Я попробовал этот пример кода:

long test = 8131818060;
string sql = @"select Sites_IP_Rede from tblRamais where E164 = '" + test.ToString() + "'";
SqlConnectionStringBuilder sqlConnectionStringBuilder = new SqlConnectionStringBuilder
{
    InitialCatalog = "xxx",
    DataSource = @"127.0.0.1\V2016",
    UserID = "xxx",
    Password = "xxx"
};
SqlConnection con = new SqlConnection(sqlConnectionStringBuilder.ConnectionString);
con.Open();
SqlCommand command = new SqlCommand(sql, con);
var ip = command.ExecuteScalar();
con.Close();
MessageBox.Show("IP Value: " + ip.ToString());

Наряду с этим SQL Код:

CREATE TABLE [dbo].[tblRamais](
    [E164] [nvarchar](10) NOT NULL,
    [Sites_IP_Rede] [varchar](20) NULL,
 CONSTRAINT [PK_tblRamais2] PRIMARY KEY CLUSTERED 
(
    [E164] ASC
)
) 
INSERT INTO tblRamais SELECT '8131818060','10.101.1.0'

Код вернул значение 10.101.1.0

Таким образом, ваша первая попытка должна быть в порядке.

Ваш второй пример потерпит неудачу, если есть какая-либо запись, в которой столбец E164 имеет не числовое значение c.

В третьей попытке эта строка не будет компилироваться:

string sql = @"select Sites_IP_Rede from tblRamais where E164 = " + num";

Ваша четвертая и пятая попытки тоже в порядке.

Когда я сталкиваюсь с такими проблемами, я всегда использую SQL Profiler для проверки оператора SQL Сервер выполнен.

...