Freelancer Martin Zeller

php asp.net java c# .net c++ xml xhtml seo magento zend framework dotnetnuke tomcat iis sql server mysql oracle typo3 coremedia

SqlHelper und benutzerdefinierte Tabellentypen mit SQL Server 2008

Tags: ,

Arbeitest du mit SQL Server 2008, SqlHelper und benutzerdefinierten Tabellentypen und erhältst folgende Fehlermeldung?

Der eingehende Tabular Data Stream (TDS) für das
RPC-Protokoll (Remote Procedure Call) ist nicht richtig.
Tabellenwertparameter ('@xxx'), Zeile n, Spalte n:
Für den Datentyp xxx (benutzerdefinierter Tabellentyp) wurde ein
Datenbankname mit einer Nicht-Null-Länge angegeben. Der Datenbankname
ist mit einem Tabellenwertparameter nicht zulässig. Es sind nur ein
Schemaname und ein Typname gültig.

Wichtig beim SqlHelper ist bei dieser Fehlermeldung, dass du den CommandType angibst. So wie hier:

// C#
dr = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, "MyProcedureName", sqlParams);

Die andere Fehlermeldung, mit der ich Bekanntschaft schließen durfte, war:

Es ist keine Zuordnung zwischen dem Objekttyp
System.Collections.Generic.List`1[[Microsoft.SqlServer.Server.SqlDataRecord, System.Data,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
und einem bekannten verwalteten systemeigenen Providertyp vorhanden.

Erhältst du diese Meldung, dann solltest du eventuell den SqlDbType deiner übergebenen Liste auf SqlDbType.Structured setzen. Siehe hier:

List<SqlDataRecord> datList = new List<SqlDataRecord>();
SqlMetaData[] tvp_definition = { new SqlMetaData("n", SqlDbType.BigInt) };
foreach (MyDataInfo dat in datas)
{
  SqlDataRecord rec = new SqlDataRecord(tvp_definition);
  rec.SetInt64(0, dat.SomePropertyId);
  datList.Add(rec);
}
SqlParameter[] sqlParams = new SqlParameter[1];
SqlParameter param = new SqlParameter("@MyParameter", datList);
param.Direction = ParameterDirection.Input;
param.TypeName = "long_list_tbltype"; // long_list_tbltype ist ein von mir definierter Tabellentyp
param.SqlDbType = SqlDbType.Structured; // IMPORTANT!!!
sqlParams[0] = param;

dr = SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, GetFullyQualifiedName("MyProcedureName"), sqlParams);

Ich bin auf diese Probleme gestoßen, weil ich eine generische Liste an eine Procedure übergeben wollte. Wie das geht, siehst du in diesem Artikel: Arrays and Lists in SQL Server

PDF: direct printing with .NET

Tags: ,

>> Download Example project (VS 2005)

In this article I will show you the results of my search to find a way to print a pdf with .NET.

My task was to find a simple solution for an intranet web application where the user gets pdf reports (ActiveReports). Depending on configuration settings these pdf files should be displayed in the browser and be printed immediately or just be printed immediatly – to the default printer or to a known network printer.
The existing solution was based on the pdf browser plugins. But it was not satisfactory because the user had to do the following steps: view the pdf file in the browser (pdf browser plugin), click the print button, handle the printer dialog popup, click the OK button to send the document to the printer. And some users had to do this more then one hundred times a day. And some users had to do this more than a hundred times a day!
My (more than revolutionary ;-) idea was, that I may need the pdf browser plugin for viewing pdf files, but not for printing them! So I tried different ways, which I wanted you to show now – I did not bring all of them to an end, as some turned out to be inappropriate for  my intentions very soon.
Important: these solutions are only making sense if you want to print to a known printer (like in intranets) – they will not work on normal, “public” web sites.

You can download the sample project and do your own experiments. Here is a screenshot of the sample project:

PrintingPDF WebApp Screenshot

My results:

  1. Printing a pdf with Ghostscript
  2. Printing a pdf with windows shell command
  3. Printing a pdf with PrintDocument object
  4. Printing a pdf with PDFsharp
  5. Printing a pdf with Acrobat Reader command line

1. Printing a pdf with Ghostscript

First you have to install Ghostscript, an interpreter for the PostScript language and for PDF. Code:

ProcessStartInfo psInfo = new ProcessStartInfo();
psInfo.Arguments = String.Format(" -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=ljet4 -sOutputFile=\"\\\\spool\\{0}\" \"{1}\"", printerName, pdfFileName);
psInfo.FileName = @"C:\Program Files\gs\gs8.70\bin\gswin32c.exe";
psInfo.UseShellExecute = false;
Process process = Process.Start(psInfo);

2. Printing a pdf with windows shell command

This is another version I found on the web. The code uses the print/printto command of the DOS shell. In the example project, which you can download above, there are two versions of parameters in the code. I never got it work, but I think, it cannot be done: you cannot print a pdf file via shell – but it will work with raw text files. Please tell me your results!
Try this in your DOS prompt:

print /D:"\\COMPUTERNAME\PRINTERNAME" "PDFFILEPATH"

For those who want to try it themselves

ProcessStartInfo psInfo = new ProcessStartInfo();
psInfo.Verb = "Print"; // or "PrintTo"
psInfo.FileName = pdfFileName;
psInfo.Arguments = String.Format("/p /h \"{0}\" \"{1}\"", pdfFileName, printerName);
psInfo.WindowStyle = ProcessWindowStyle.Hidden;
psInfo.CreateNoWindow = true;
psInfo.UseShellExecute = true;
Process process = Process.Start(psInfo);

3. Printing a pdf with PrintDocument object

Using the .NET object PrintDocument is another possible way, but you will need third party components to raster the pdf. More information: >>Component for rendering pdf documents

PrintDocument pd = new PrintDocument();
pd.DocumentName = pdfName;
pd.PrinterSettings.PrinterName =printerName;
pd.PrinterSettings.PrintFileName = fileName;
pd.PrintController = new StandardPrintController();
pd.OriginAtMargins = false;
pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
pd.Print();

4. Printing a pdf with PDFsharp

PDFsharp is an open source .NET library for processing PDF. You can use it for printing too. Simple usage, but the problem here: the AdobeReader application window appears (not suitable for my intentions). But I found out that you do not need PDFsharp to print out a pdf – see chapter 5

PdfFilePrinter.AdobeReaderPath = @"C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe"
PdfFilePrinter printer = new PdfFilePrinter(pdfFileName, printerName);
printer.Print();

5. Printing a pdf with Acrobat Reader command line

This was the best way for me! Although I’ve read that this only works with old versions of Acrobat Reader, it works with version 9.0!
A word to the arguments:
print it to the default printer: /s /o /h /p “pdfFileName”
print it to a defined printer: /s /o /h /t “pdfFileName” “printername” “drivername” “portname”
More information at the Adobe Acrobat Developer FAQ on page 27!
To download the free acrobat reader use this link: Acrobat Reader

ProcessStartInfo psInfo = new ProcessStartInfo();
psInfo.FileName = @"C:\Program Files\Adobe\Reader 9.0\Reader\AcroRd32.exe";
psInfo.Arguments = String.Format("/s /o /h /p{0}", pdfFileName);
psInfo.WindowStyle = ProcessWindowStyle.Hidden;
psInfo.CreateNoWindow = true;
psInfo.UseShellExecute = true;
Process process = Process.Start(psInfo);

© 2009 Freelancer Martin Zeller. All Rights Reserved.

This blog is powered by Wordpress and Magatheme by Bryan Helmig.