TroxyMedlem sedan mars 20041 505 inlägg Hallå, :)
jag har ett uppdrag att importera textfiler till SQL Server 2005.
Målet är att bygga ett program som kan anropas med jämna mellanrum.
Textfilerna är sk. fixed-length, dvs. 1 post/rad och X tecken/kolumn.
Antalet poster kan variera stort, allt mellan några hundra till nästan 1 miljon!
Antagligen måste jag bolla lite med datatyper för att matcha SQL-tabellen, ex. decimaltal.
Jag har kollat in SqlBulkCopy som verkar perfekt för att trycka in stora mängder data i ett svep.
Men jag undrar om SqlBulkCopy kan läsa textfilerna direkt, eller måste jag göra det som ett tidigare steg?
Sen finns det även TextFieldParser som läser textfiler, bla. csv eller fixed-length.
Ska jag använda en sån för att mata SqlBulkCopy med poster tro?
Tacksam för hjälp!
Detta är dessutom min första .NET-applikation som jag någonsin skriver. :p
cokMedlem sedan dec. 2005664 inlägg Ta annars en titt på SSIS, där kan du göra imoprter/exporter till olika data-källor etc. Du kan även koppla detta till din c#.
ZaimanMedlem sedan dec. 20014 239 inlägg Så här gjorde jag en gång i tiden för att importera en specifik textfil, kanske inte optimal och inte så mycket felhantering. Men jag vet att filen ser ut på det specifika sättet.
Bara ett exempel...
public static void doImport()
{
string line;
int countComma;
int antalKorrekta = 0;
int antalFelaktiga = 0;
string[] myArr;
string importFile = ConfigurationManager.AppSettings["dbunderlag"].ToString();
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["dbJokerEtikett"].ConnectionString);
SqlCommand cmd = new SqlCommand("uppdateraArtikel", conn);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
SqlParameter pArtnr = cmd.Parameters.Add("@artnr", System.Data.SqlDbType.VarChar, 100);
SqlParameter pBenamning = cmd.Parameters.Add("@benamning", System.Data.SqlDbType.VarChar, 100);
SqlParameter pSlr = cmd.Parameters.Add("@slr", System.Data.SqlDbType.VarChar, 100);
SqlParameter pKortnamn = cmd.Parameters.Add("@kortnamn", System.Data.SqlDbType.VarChar, 100);
if(File.Exists(importFile))
{
conn.Open();
using (TextReader tx = new StreamReader(importFile, System.Text.Encoding.Default, false))
{
while ((line = tx.ReadLine()) != null)
{
line = line.Replace('\"', ' ');
countComma = Regex.Matches(line, "[,]").Count;
if (countComma == 6)
{
myArr = line.Split(new Char[] { ',' });
if (myArr[0].IndexOf("H") != 1)
{
pArtnr.Value = myArr[3].ToString().TrimStart().TrimEnd();
pBenamning.Value = myArr[4].ToString().TrimStart().TrimEnd();
pKortnamn.Value = myArr[6].ToString().TrimEnd();
pSlr.Value = myArr[5].ToString();
cmd.ExecuteNonQuery();
}
antalKorrekta++;
}
else
{
antalFelaktiga++;
}
}
string doLog = "Antal importerade rader: " + antalKorrekta.ToString() +"\nAntal ej importerad rader: " + antalFelaktiga.ToString();
LogEvt.logInfo(doLog);
}
}
if (conn != null)
{
conn.Close();
}
}
pebiMedlem sedan jan. 2005327 inlägg Jag håller med, det borde ju funka fint med SQL-servers egna inbyggda import rutiner, som du kan schemalägga med sql-agent.
Så om detta är det enda ditt program skall göra behövs det nog inget program... Dvs gör en import, och välj att spara den, och schemalägg den.
Då behöver det ju bara finnas textfiler av rätt format på rätt ställe när sql-agent drar igång jobbet.
/pebi
TroxyMedlem sedan mars 20041 505 inlägg Tack för förslagen,
man blir snurrig när det finns så många olika verktyg.
Men det löser sig nog :e