2015-04-22 4 views
0

У меня есть сценарий OPENQUERY SQL:Как использовать OPENQUERY в C#

Select * from openquery([oak],' 
SELECT LicenseKey, SUM(PaymentAmount)as Payments 
FROM vw_ODBC_actv_Payments pt 
WHERE MONTH(pt.EntryDate) = 2 and 
YEAR(pt.EntryDate) = 2015 
GROUP BY LicenseKey 
') 

Когда я запускаю это из SSMS я могу видеть, что она возвращает ожидаемые п строк.

Однако, когда я стрелять это с теми же свойствами подключения, чтобы получить данные в DataSet для приложения C# консоли:

SqlDataAdapter da = new SqlDataAdapter(); 
    SqlCommand pcmd= new SqlCommand(); 
    DataSet ds= new DataSet(); 
    OpenConnection(); 
    pcmd.Connection = new SqlConnection("Data source=IP adress of the server;Initial Catalog=master; user ID=***; password=***"); 
    cmd.CommandText = "Select * from openquery([oak],'" + 
    "SELECT LicenseKey, SUM(PaymentAmount)as Payments" + 
    "FROM vw_ODBC_actv_Payments pt " + 
    "WHERE MONTH(pt.EntryDate) = 2 and" + 
    "YEAR(pt.EntryDate) = 2015" + 
    "GROUP BY LicenseKey')"; 
try 
{ 
    da.SelectCommand = pcmd; 
    da.Fill(ds); //here comes the error 
} 
catch (Exception ex) 
{ 
    throw new Exception("DBUtils.ExecuteReader():" + ex.Message); 
} 

Я получаю сообщение об ошибке, как это:

Поставщик указывает, что у пользователя не было разрешения на выполнение . Теперь мне нужно что-то сделать с этим вопросом

Я просто узнаю об открытии. Может ли кто-нибудь руководить?

+3

Вы не открываете соединение нигде от вышеуказанного кода. Также вы не объявили 'ds' – Izzy

+0

@Izzy - это был код из моего проекта. Пользовательские функции предоставляют соединения и данные. Моя проблема возникает, когда я открываю соединение. – xameeramir

ответ

1

Во-первых, вы не открываете соединение в любом месте своего кода и, следовательно, ошибку. Второй очистите ваш код с помощью блока using. Поэтому, если запрос работает по мере необходимости, вы можете сделать что-то вроде этого.

using(SqlConnection con = new SqlConnection("Connection String Here")) 
    { 
     string myQuery = "Your Query"; 
     using(SqlCommand cmd = new SqlCommand(myQuery, con)) 
     { 
      using (SqlDataAdapter sda = new SqlDataAdapter()) 
      { 
       con.Open(); 
       sda.SelectCommand = cmd; 
       DataSet ds = new DataSet(); 
       sda.Fill(ds); 
      } 
     } 
    } 

Примечание: Было бы лучше, если бы вы сохранили connectionString в файле config и прочитать его в вашем коде.

+0

еще есть такое же исключение. – xameeramir

+1

Попробуйте 'providerName =" System.Data.SqlClient "' в вашем 'connectionString' – Izzy

+0

Ключевое слово не поддерживается:' providername' – xameeramir