Tag Archives: MySQL

… contains no columns that can be selected or the current user does not have permissions on that object

I’ve just skimmed through my stats and found that googling for the above expression is popular so much that you would never expect. Something tells me that most of the people need some reassuring words in English and not this transcript from the black box of an extraterrestrial space ship.

So. This the error message that you see when you try to run a SQL SELECT in a Microsoft SQL server environment on a MySQL database where the MySQL server is defined as a linked server.

When you face this problem you have probably done the first step successfully - defined the link. As far as I’m concerned, the only way to do that is using the MySQL ODBC driver:

EXEC master.dbo.sp_addlinkedserver @server = N’LinkedServerName’, @srvproduct = N’MySQL’, @provider = N’MSDASQL’, @provstr = N’Driver = {MySQL ODBC 3.51 Driver}; DB=[database]; SERVER=[server]; uid=[user_id]; pwd=[password]

Having done this, you are able to browse the MySQL server for databases and the databases for tables, views, etc. And then … you’re stuck here without a vague chance to access your data.

Don’t ask. I don’t know either. It may be a feature as well as a bug.

But you can have your data through the openquery command of the T-SQL like this:

SELECT * FROM OPENQUERY(LinkedServerName, ‘SELECT * FROM [table name]‘) AS tbl1

Quite strange. And uneasy. Not running the command itself but passing it as a string to a function is not what you normally do. Not even on linked servers.

Tags: , ,

nem piskóta

(for a version in a less exclusive language, click here.)

legalább három órányi szopáson vagyok túl, közben vagy ötször feltúrtam az egész internetet oda meg vissza, minimális sikerrel. tehát leírom, hátha másnak is jól jön.

alapfeladat

Microsoft SQL szerveren csatolt szerverként (linked server) létrehozni egy MySQL szervert, hogy MS SQL ütemezett tárolt eljárásokban MySQL adatokat tudjunk feldolgozni. tudom, perverz.

megoldás

egyetlen járható út van, a MySQL-hez nincsen OLE DB meghajtó, így marad az ODBC. azt még kis guglizással meg lehet találni, hogy egy ilyesmi parancs létrehozza a kapcsolatot:

EXEC master.dbo.sp_addlinkedserver @server = N’LinkedServerName’, @srvproduct = N’MySQL’, @provider = N’MSDASQL’, @provstr = N’Driver = {MySQL ODBC 3.51 Driver}; DB=[database]; SERVER=[server]; uid=[user_id]; pwd=[password]

ekkor azonban az ember egy olyan hülye helyzetben találja magát, hogy meg tudja tekinteni a MySQL katalógusokat (adatbázisokat), azokban a táblákat és a nézeteket, oszt jónapot. más csatolt MS SQL, DB2 vagy syBase működik rendesen, csak ez nem. mindenféle hibaüzeneteket generál, hogy például ez a tábla contains no columns that can be selected or the current user does not have permissions on that object.

merthogy adatokat lekérdezi meg egy OPENQUERY-s kanyarral kell:

SELECT * FROM OPENQUERY(LinkedServerName, ‘SELECT * FROM [table name]‘) AS tbl1

nehéz az élet.

Tags: , ,

mégegyszer, utoljára .NET és MySql

a MySQL ODBC-meghajtója egyszerűen nem jó. magyargyűlölő szoftver. a szolgáltatóm supportja azt mondta, hogy csak a kódolást kell rendesen beállítani az adatbázisban és a táblákon UTF-8-ra, azonban az összes lehetséges permutáció végigpróbálgatása után, de még mezőszinten is babrálva, letettem arról, hogy valaha ő és ű karaktereket lássak viszont az oldalon.

a .NET connector működik, viszont van egy komoly szépséghibája, púpos kizárólag full trust módban hajlandó futni. ha valakinek saját szervere van, annak esetleg jó lehet, a web hosting szolgáltatók viszont, a több alkalmazást futtató shared szervereikkel eleve fel sem telepítik. a full trust és a shared szerver sehogysem jön össze, vagy ha mégis, akkor az komoly biztonsági rés: bármelyik alkalmazás hozzáfér bármelyik másik alkalmazás adataihoz. (lásd pl. K. Scott Allen)

jó lenne

ha fenn lenne a .NET connector, akkor nagyjából négy lépésből állna egy primitív oldal elkészítése: 1. bedobni egy SqlDataSource controlt; 2. beállítani rajta, hogy a provider a MySql.Data.MySqlClient, mi a connection string és mi a select command (a képen); 3. bedobni egy data-aware controlt; 4. beállítani rajta, hogy az előbbi SqlDataSource az adatforrása és hogy melyik mezőt jelenítsemeg.

ez kódban körülbelül ennyi:

<asp:sqldatasource
    id="dsBlogEntries" runat="server"
    connectionstring="Database=yourDatabase;Data
    Source=yourServer;User Id=userID;Password=password"
    providername="MySql.Data.MySqlClient"
    selectcommand="SELECT * FROM `blog-entries` ORDER
    BY id DESC"></asp:sqldatasource>

az adatforrás és - a DataList controlt most ugorgyuk át - mellé egy szövegcímke, ami kiírja a blogpost címét:

<h1><asp:label id="titleLabel" runat="server" text='<%# Eval("title") %>'>
</asp:label></h1>

de ezt csak azért mondtam el,

amiért amszterdam is létezik - hogy lássuk, hogy ilyen is van, csak mi nem vagyunk méltóak rá. ezért élünk a budapesti állatkertben.

a manual workaround kalandos kicsit. a .NET lehetőséget nyújt arra, hogy az alkalmazás bin könyvtárában előre lefordított, bináris állományokat tároljunk és hívogassunk meg. szigorúan csak kódból. ha ide, a bin könyvtárba betesszük a mysql hivatalos connectorát és elkezdenénk használni, akkor jutunk el ahhoz a rémesen frusztráló hibaüzenethez, hogy “That assembly does not allow partially trusted callers”. a full és a medium trust, ugye.

de nincs minden veszve. jött pár álarcos hős és visszatolták a döglött lovat a szomszéd telkére. vagyis forrásban töltötték le a MySql AB connectorát, kijavították és elérhetővé tették úgy, hogy a bin medium trustban is fut. mit fut, szakít! ezt a mysql.data.dll-t kell betenni a bin könyvtárba.

azért a vizuális részét el lehet felejteni a dolognak, mivel a szerverre nincsen feltéve a natív kliens és a bin könyvtár dll-jei csak kódból hívhatóak, nincsen értelme SqlDataSource controlt bedobni az oldalba és két kattintással megmondani neki, hogy a MySqlClient a data provider, ezzel csak csak újabb application errorhoz jutunk el. helyette, vagyis a fenti pár soros kód helyett, ez van (primitív megközelítésben, minden cizellálás nélkül):

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
  Handles Me.Load
    Dim conn As MySqlConnection = _
    New MySqlConnection("Server=yourServer;User
      Id=userID;Password=password;Database=yourDatabase;
      Pooling=false;")    Dim strSQL As String = "SELECT * FROM `blog-entries` ORDER BY id DESC;"
    Dim blogDataA As MySqlDataAdapter = New MySqlDataAdapter(strSQL, conn)
    blogDataA.SelectCommand = New MySqlCommand(strSQL, conn)
    Dim ds As DataSet = New DataSet("dsBlog")
    blogDataA.Fill(ds)
    blogMain.DataSource = ds
    blogMain.DataBind()
End Sub

ahol is a blogMain egy DataList control, amiben van többek között a fenti címke is, ami a post címét jeleníti meg.

nem az a baj vele, hogy többet kell gépelni, nem számottevő. inkább az, hogyilyen nyakatekert módon, mondjuk a Page_Load eseményben, vagy a DataList init eseményébenkell ezt kezelni, dizájn helyett - teljesen feleslegesen - kódolni.

Tags: , ,

fizetek

egy sört annak, aki megmondja, hogy a MySQL adatbázisban még rendesen meglévő ékezeteket (ő és ű) miért nem győzi le az asp.net 2.0. nyilván én tolok el valamit, de mit?

nacionalgaleri-at-gmail-dot-com

Tags: ,