praegune kellaaeg 20.06.2025 22:55:32
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
neros
HV Guru

liitunud: 26.11.2003
|
01.03.2009 11:50:12
Accessi SQLi probleemid + mp3 id3 tagis genre saamine |
|
|
Probleem järgmine.
On tarvis queryga saada unikaalsed kirjed. Kui MySQLis (ja ilmselt kõigis teistes sqlides) toimib selline käsk:
tsitaat: |
SELECT Title, Artist FROM mp3db GROUP BY Artist |
Siis loobitakse mulle midagi aggregate functioni kohta (aka error).
SELECT Title, Artist FROM mp3db WHERE Artist IN (SELECT DISTINCT Artist FROM mp3db) |
Siin lihtsalt ignoreerib access täielikult seda subqueryt (distinct).
Et siis küsimus on selles, kuidas saada ühe välja unique väärtused koos teiste väljadega.
=====================
Teine probleem.
public class MusicID3Tag
{
public byte[] TAGID = new byte[3];
public byte[] Title = new byte[30];
public byte[] Artist = new byte[30];
public byte[] Album = new byte[30];
public byte[] Year = new byte[4];
public byte[] Comment = new byte[30];
public byte[] Genre = new byte[1];
}
|
See on mp3'e ID3 tag, vastavalt google antud lehekülgedele.
mi.Genre = Encoding.Default.GetString(tag.Genre);
|
See aga annab mulle mingi hoopistükkis imeliku väärtuse, umbes nagu mingi random ascii chari. Ristid, punktid, tärnid, kolmnurgad, suvalised tähestiku tähed...
Milles võib olla probleemi?
E: Ise küsin, ise vastan. Encoding.Default.GetString konverdib numbri vastavaks ascii chariks.
Aga nüüd tekib uus küsimus... juba tükk aega olen üritanud, aga mitte ei suuda välja mõelda kuidas byte'i valuet kätte saada, a la mitte ascii chari vaid nt "132"...
|
|
Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
tagasi üles |
|
 |
nene
Kreisi kasutaja

liitunud: 20.03.2004
|
01.03.2009 13:46:13
Re: Accessi SQLi probleemid + mp3 id3 tagis genre saamine |
|
|
Kummalised küsimused sul...
SELECT Title, Artist FROM mp3db GROUP BY Artist |
Näiteks MySQL-is annab see sulle nimekirja artistidest koos iga artisti juhusliku looga - tulemus mida enamasti keegi ei taha. Järgmine päring on veel imelikum...
SELECT Title, Artist FROM mp3db WHERE Artist IN (SELECT DISTINCT Artist FROM mp3db) |
See on ju täpselt sama mis lihtsalt:
SELECT Title, Artist FROM mp3db |
Mida sa õigupoolest saavutada püüad?
madedog kirjutas: |
kuidas byte'i valuet kätte saada, a la mitte ascii chari vaid nt "132"... |
Hmmm... Aga byte'i väärtus ongi ju number. Kui see keel on ikka C# nagu ma oletan.
_________________ Mõistus otsas? Pane pinusse... |
|
Kommentaarid: 24 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
23 |
|
tagasi üles |
|
 |
reneSharp
HV kasutaja

liitunud: 13.11.2005
|
01.03.2009 17:35:31
Re: Accessi SQLi probleemid + mp3 id3 tagis genre saamine |
|
|
madedog kirjutas: |
Aga nüüd tekib uus küsimus... juba tükk aega olen üritanud, aga mitte ei suuda välja mõelda kuidas byte'i valuet kätte saada, a la mitte ascii chari vaid nt "132"... |
Katsetasin ka veits .
const char taht = 'A';
Console.WriteLine(taht); //prindib ASCII chr A
Console.WriteLine((byte)taht); //prindib ASCII dec 65
const byte number = 65;
Console.WriteLine((char)number);//prindib A
Console.WriteLine(number);//prindib 65
var sona = "Album";
//sona baitideks
var bytes = new byte[sona.Length];
for (int i = 0; i < sona.Length; i++)
bytes[i] = (byte) sona[i];
var bytesAlt =Encoding.ASCII.GetBytes(sona);
for (int i = 0; i < bytesAlt.Length; i++)
{
//tundub et see GetBytes teeb sama asja mis ylal.
Debug.Assert(bytesAlt[i]==bytes[i]);
}
//ning annab sona tagasi ka
Debug.Assert("Album" == Encoding.ASCII.GetString(bytes));
|
Leidsin jupi koodi : http://www.developerfusion.com/code/4684/read-mp3-tag-information-id3v1-and-id3v2/
ID3v1 tagreader = new ID3v1("c:\\Remix.mp3");
tagreader.Read();
Console.WriteLine(tagreader.Title);
tagreader.Title = "Uus pealkiri";
tagreader.updateMP3Tag();
|
EDIT:
tundub et olid õigel teel, ma täiendasin su klassi veits
Spoiler 
internal class Program
{
private static void Main(string[] args)
{
MusicID3Tag tag = MusicID3Tag.LoadFrom("c:\\Remix.mp3");
tag.TAGID = "23";
tag.Title = "Test";
tag.Album = "Album";
tag.Artist = "Artist";
tag.Comment = "Comment";
tag.Update("c:\\Remix.mp3");
tag = MusicID3Tag.LoadFrom("c:\\Remix.mp3");
Debug.Assert(tag.TAGID == "23");
Debug.Assert(tag.Title == "Test");
Debug.Assert(tag.Album == "Album");
Debug.Assert(tag.Artist == "Artist");
Debug.Assert(tag.Comment == "Comment");
}
public class MusicID3Tag
{
public static MusicID3Tag LoadFrom(string mp3FileName)
{
var tagBuffer = new byte[128];
using (var mp3Stream = new FileStream(mp3FileName, FileMode.Open))
{
mp3Stream.Seek(-128, SeekOrigin.End);
mp3Stream.Read(tagBuffer, 0, 128);
}
var tag = new MusicID3Tag();
for (int i = 0, offset = 0; i < tag.tagInfo.Count; i++)
{
Buffer.BlockCopy(tagBuffer, offset, tag.tagInfo[i], 0, GetPropertyLength(i));
offset += GetPropertyLength(i);
}
return tag;
}
private const int TAGID_LENGTH = 3;
private const int FREETEXT_LENGTH = 30;
private const int YEAR_LENGTH = 4;
private const int GENRE_LENGTH = 1;
private readonly List<byte[]> tagInfo = new List<byte[]>
{
new byte[TAGID_LENGTH],
//tagid
new byte[FREETEXT_LENGTH],
//title
new byte[FREETEXT_LENGTH],
//artist
new byte[FREETEXT_LENGTH],
//album
new byte[YEAR_LENGTH],
//year
new byte[FREETEXT_LENGTH],
//comment
new byte[GENRE_LENGTH] //genre
};
public string TAGID
{
get { return GetTagPropertyValue(0); }
set { SetTagPropertyValue(0, value); }
}
public string Title
{
get { return GetTagPropertyValue(1); }
set { SetTagPropertyValue(1, value); }
}
private static int GetPropertyLength(int atIndex)
{
if (atIndex == 1 || atIndex == 2 || atIndex == 3 || atIndex == 5)
return FREETEXT_LENGTH;
if (atIndex == 0) return TAGID_LENGTH;
if (atIndex == 4) return YEAR_LENGTH;
if (atIndex == 6) return GENRE_LENGTH;
throw new ArgumentOutOfRangeException();
}
private void SetTagPropertyValue(int atIndex, string newValue)
{
tagInfo[atIndex] = new byte[GetPropertyLength(atIndex)];
tagInfo[atIndex] = Encoding.ASCII.GetBytes(newValue).Take(tagInfo[atIndex].Length).ToArray();
}
private string GetTagPropertyValue(int atIndex)
{
return Encoding.ASCII.GetString(tagInfo[atIndex]).TrimEnd('\0');
}
public string Artist
{
get { return GetTagPropertyValue(2); }
set { SetTagPropertyValue(2, value); }
}
public string Album
{
get { return GetTagPropertyValue(3); }
set { SetTagPropertyValue(3, value); }
}
public string Year
{
get { return GetTagPropertyValue(4); }
set { SetTagPropertyValue(4, value); }
}
public string Comment
{
get { return GetTagPropertyValue(5); }
set { SetTagPropertyValue(5, value); }
}
public string Genre
{
get { return GetTagPropertyValue(6); }
set { SetTagPropertyValue(6, value); }
}
public void Update(string mp3FileName)
{
var tagBuffer = new byte[128];
for (int i = 0, offset = 0; i < tagInfo.Count; i++)
{
Buffer.BlockCopy(tagInfo[i], 0, tagBuffer, offset, tagInfo[i].Length);
offset += GetPropertyLength(i);
}
using (var mp3Stream = new FileStream(mp3FileName, FileMode.Open))
{
mp3Stream.Seek(-128, SeekOrigin.End);
mp3Stream.Write(tagBuffer, 0, 128);
}
}
}
} |
|
|
Kommentaarid: 25 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
25 |
|
tagasi üles |
|
 |
neros
HV Guru

liitunud: 26.11.2003
|
01.03.2009 19:30:38
Re: Accessi SQLi probleemid + mp3 id3 tagis genre saamine |
|
|
Jah, see on siiski tulemus mida mul tarvis on. Teine päring ei ole päris täpselt sama imo...
Aga jah, ongi vaja nimekirja artistidest koos juhusliku looga.
Aga see byte teema... krt ma vist jagasin matsu lahti milles teema on, ma kontrollin asja üle...
E:
Jep, nii oligi, kui ma seda funktsiooni kirjutasin, siis läks must täiesti mööda fakt, et see on tegelikult ühe elemendiga massiiv ja mitte lihtsalt number....
|
|
Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
tagasi üles |
|
 |
Brigadir
HV vaatleja

liitunud: 21.05.2002
|
01.03.2009 21:47:30
|
|
|
tsitaat: |
SELECT Title, Artist FROM mp3db WHERE Artist IN (SELECT DISTINCT Artist FROM mp3db)
See on ju täpselt sama mis lihtsalt:
SELECT Title, Artist FROM mp3db |
Täitsa sama vist ikka ei ole. Loomalikult ei ole ma accessi guru, kuid tema päringus annab subquery NULL väärtusega artistidega kirjete eemaldamise efekti. Samas kui artist atribuut on tabelis "not null" constraintiga, siis on subquery täiesti mõttetu ja loomalikult igal juhul saab seda "where artist is not null" tingimusega elegantsemalt teha.
accessi valda, kuid vbl aitab midagi sellist sind edasi
http://objectmix.com/inetserver/282780-select-random-record-access.html selle keevitad oma subquerysse, mis artisti asemel leiab sulle hoopis loo ID väärtuse.
_________________ Vähem möla, pikem samm! |
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|